cookie主要完成同一会话中不同请求响应间数据传输的任务。cookie是一种消息载体,是在服务器端生成的,首次会以响应报文中传输到客户端,客户端浏览器会将cookie中的内容保存到本地磁盘上,之后再向服务器发送请求时会带着cookie,从而完成多次请求响应中的消息传输问题。
cookie中消息为一组字符串组成的键值对。
使用最为广泛为两个场景为:电商网站的购物车,记住用户名与密码。
@Controller
public class CookieController {
@RequestMapping("/add")
@ResponseBody
public String add(HttpServletResponse response, HttpServletRequest request){
Cookie cookie = new Cookie("name","zyd");
// 设置携带该cookie的路径
cookie.setPath(request.getContextPath() + "/test");
// 设置过期时间为1年并保存到客户端磁盘 ,默认小于0是只保存到内存的
cookie.setMaxAge(60 * 60 * 24 * 365);
response.addCookie(cookie);
return "success";
}
@RequestMapping("/test")
@ResponseBody
public String test(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
StringBuilder sb = new StringBuilder();
for(Cookie cookie : cookies){
sb.append(cookie.getName() + " " + cookie.getValue());
}
return sb.toString();
}
}
与cookie相同也是一种会话跟踪技术,不过session是将会话的状态信息保存到服务器端。
服务器中会为每个会话维护一个session。同一会话一直使用一个session,不同会话使用不同的session。
为了保证上述两目标,session以下步骤运行:
1)写入session列表
session列表底层就是一个map,其key为32长度的随机串,称之为JSessionID,value为session对象的引用。首次提交请求时执行request.getSession()方法后会生成一个session对象。
2)服务器将JsessionId以cookie的方式发送给浏览器
系统会产生name = “JSESSIONID”,32位的随机串作为value 的cookie发送给浏览器。该cookie是不写到硬盘的。
3)客户端接收并发送cookie
之后的请求会带着该cookie。
4)从session列表中查找
根据发送而来的cookie中的“JSESSIONID”的值从Map中查找。
当禁用cookie后,第三步客户端再次给服务请求时不会带着jsessionID,服务器就以为该请求是新的会话,因此会在响应报文中给客户端产生并发送新的sessionid。