这里是修真院后端小课堂,每篇分享文从
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】
八个方面深度解析后端知识/技能,本篇分享的是:
【cookie和session】
大家好,我是IT修真院上海分院第八期学员,一枚正直纯洁善良的JAVA程序员。
今天给大家分享一下,修真院官网JAVA任务五,扩展思考中的知识点——cookie和session
1 背景介绍
什么是会话?
用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话
HTTP协议是一种"无状态"协议,客户浏览器与服务器建立连接,发出请求,得到相应,然后关闭连接,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。
所以容器不能辨认下一个请求和之前的请求是不是同一个请求,对于容器而言,每个请求都是新的。
使用浏览器与服务器进行会话的过程中,不可避免会产生一些数据,Web服务器没有短期记忆,如何保存这些用户数据?
客户需要一个唯一的会话ID
客户的第一次请求,容器会生成一个唯一的会话ID,并通过响应把它发回客户端,客户在以后的每一个请求中发回这个会话ID。容器看到后,就会找到匹配的会话,并把这个会话与请求关联。
2 知识剖析
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
3 常见问题
浏览器禁用Cookie怎么办?
4 解决方案
URL重写、隐藏表单字段
5 编码实战
cookie:
cookie工具类
????/*
??????添加cookie
??????@param?response
??????@param?key?cookie主键
??????@param?value??cookie值
?????/
????public?static?void?addCookie(HttpServletResponse?response,String?key,String?value){
????????Cookie?cookie?=?new?Cookie(key,value);
????????//设置路径
????????cookie.setPath("/");
????????//设置保存时间为1天,单位为s
????????cookie.setMaxAge(246060);
????????//通过response.addCookie将此条cookie添加到客户端
????????response.addCookie(cookie);
????}
????/*
??????删除cookie
??????@param?response
??????@param?request
??????@param?key
?????/
????public?static?void?deleteCookie(HttpServletResponse?response,?HttpServletRequest?request,String?key)?{
????????//获取浏览器访问服务器时传递来的cookie数组
????????Cookie?cookies[]?=?request.getCookies();
????????if?(cookies?!=?null)?{
????????????for?(int?i?=?0;?i?<?cookies.length;?i++)?{
????????????????if?(cookies[i].getName().equals(key))?{
????????????????????Cookie?cookie?=?new?Cookie(key,?null);
????????????????????//此路径需与之前创建时相同
????????????????????cookie.setPath("/");
????????????????????//设置为0即为删除
????????????????????cookie.setMaxAge(0);
????????????????????response.addCookie(cookie);
????????????????}
????????????}
????????}
????}
????/*
??????获取指定cookie
??????@param?request
??????@param?key
??????@return
??????@throws?UnsupportedEncodingException
?????*/
????public?static?String?getCookieValue(HttpServletRequest?request,String?key)?throws?UnsupportedEncodingException?{
????????//通过request.getCookies获取客户端提交的所有cookie
????????for?(Cookie?cookie?:?request.getCookies())?{
????????????if?(cookie.getName().equals(key))?{
????????????????return?URLDecoder.decode(cookie.getValue(),?"UTF-8");
????????????}
????????}
????????return?null;
????}
}
controller
????@RequestMapping(value?=?"/cookie",?method?=?RequestMethod.POST)
????public?String?cookie(@RequestParam?String?name,?String?password,?HttpServletResponse?response,?Model?model){
????????CookieUtil.addCookie(response,"name",name);
????????CookieUtil.addCookie(response,"password",password);
????????model.addAttribute("name",name);
????????model.addAttribute("password",password);
????????return?"cookie";
????}
????@RequestMapping(value?=?"getcookie",method?=?RequestMethod.GET)
????public?String?getcookie(HttpServletRequest?request,Model?model)?throws?UnsupportedEncodingException?{
????????String?name?=CookieUtil.getCookieValue(request,"name");
????????String?password?=?CookieUtil.getCookieValue(request,"password");
????????model.addAttribute("name",password);
????????return?"cookie";
????}
????@RequestMapping(value?=?"deletecookie",method?=?RequestMethod.GET)
????public?String?deletecookie(HttpServletRequest?request,HttpServletResponse?response,Model?model)?throws?UnsupportedEncodingException?{
//????????CookieUtil.deleteCookie(response,request,"name");
????????CookieUtil.deleteCookie(response,"password");
????????String?name?=?CookieUtil.getCookieValue(request,password);
????????return?"redirect:test.jsp";
????}
}
表单jsp
????
????????密码
????????
????
????<a?href="/getcookie">获取cookie
????<a?href="/deletecookie">删除cookie
???? |