这里是修真院后端小课堂,每篇分享文从
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】
八个方面深度解析后端知识/技能,本篇分享的是:
【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