HTTP是无状态的、有会话的
要想让服务器记住请求的人是谁、发送了几次请求,就要用到cookie
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies
cookie有点像身份证,浏览器第一次访问服务器时,服务器给浏览器发送一个身份证(cookie),浏览器存在本地,当浏览器再次访问服务器时带上身份证(cookie),服务器就知道浏览器是谁了
1 cookie
1.1 服务器给初次访问的浏览器发cookie
//测试服务器给浏览器发送cookie
@RequestMapping(path = "/cookie/set",method = RequestMethod.GET)
@ResponseBody
public String setCookie(HttpServletResponse response){
Cookie cookie = new Cookie("code",CommunityUtil.generateUUID());
cookie.setPath("/community");
cookie.setMaxAge(60*10);//不设置生存时间的话,默认关闭浏览器cookie就消失,设置的话浏览器会存到本地
response.addCookie(cookie);
return "set cookie success";
}
对比不设置cookie的
//对比不设置cookie的
@RequestMapping(path = "/nocookie",method = RequestMethod.GET)
@ResponseBody
public String noCookie(){
return "no cookie";
}
1.2 浏览器再次访问服务器时带上cookie
再次访问时浏览器带上了cookie
@RequestMapping(path = "/cookie/get",method = RequestMethod.GET)
@ResponseBody
public String getCookie(@CookieValue("code") String code){
System.out.println(code);
return "get cookie";
}
得到了cookie(值不一样是因为这是分两次做的,上一个cookie过期了)
1.3 cookie的特点
优:
cookie可以弥补HTTP无状态的特点
缺:
cookie存在客户端,没有安全性
cookie需要发送给服务端,占用流量
2 session
JavaEE的标准
在服务端记录客户端的信息,与cookie正好相反,cookie是存在客户端的
缺点:session存在服务端,占用内存
session工作原理:浏览器第一次访问服务器时,服务器生成一个session用于标识该浏览器,服务器返回给浏览器的响应中带了cookie,cookie中带了session id,浏览器把cookie存在本地,下次访问时带上cookie,服务器通过cookie中的session id标识浏览器
2.1 服务器给第一次访问的浏览器创建session,并用cookie传回session id
//session示例
@RequestMapping(path = "session/set",method = RequestMethod.GET)
@ResponseBody
public String setSession(HttpSession session){
session.setAttribute("id", 1);
session.setAttribute("name","test");
return "set session";
}
浏览器访问服务器其他页面时也会带上session id
2 服务器从浏览器的请求中得到cookie->session id->session->从而标识浏览器
@RequestMapping(path = "session/get",method = RequestMethod.GET)
@ResponseBody
public String getSession(HttpSession session){
System.out.println(session.getAttribute("id"));
System.out.println(session.getAttribute("name"));
return "get session";
}