创建cookie
//创建cookie
@RequestMapping(path = "/cookie/set", method = RequestMethod.GET)
@ResponseBody
public String setCookie(HttpServletResponse response) {
// 创建cookie
Cookie cookie = new Cookie("code", CommunityUtil.generateUUID());
// 设置cookie生效的范围 哪些请求会发cookie
cookie.setPath("/cookie");
// 设置cookie的生存时间 单位s,设置后会将cookie存入硬盘中
cookie.setMaxAge(60 * 10);
// 发送cookie
response.addCookie(cookie);
return "set cookie";
//获取cookie
@RequestMapping(path = "/cookie/get", method = RequestMethod.GET)
@ResponseBody//从cookie数组中寻找Key为code的cookie
public String getCookie(@CookieValue("code") String code) {
System.out.println(code);
return "get cookie";
}
}
创建session
cookie放在客户端不安全,我们可以使用session来记录客户端行为,session也还是要依赖cookie的:当客户端访问服务器,服务器会生成一个cookie发给客户端,客户端下次带着cookie访问时,服务器就能找到对应的session
//创建session
@RequestMapping(path = "/session/set", method = RequestMethod.GET)
@ResponseBody //session对象的类型是httpSession
public String setSession(HttpSession session) {
session.setAttribute("id", 1);
session.setAttribute("name", "Test");
return "set session";
}
//获取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";
}
服务器分布式部署的时候session会有一些问题:
nginx在分配请求的时候,前后两次可能会发给不同的服务器,导致产生的session不同
解决方案:
1 粘性处理:让同一个ip的请求发送给同一个服务器(会加大这个服务器压力,不能保证负载均衡)
2同步session:如果一个服务器创建了session就把session同步到其他所有服务器(占用服务器的空间,服务器之间有耦合)
3共享session:一个服务器单独存放session,其他服务器向这个服务器获取session(如果这个服务器挂了,影响太大)
4尽量用cookie,如果数据敏感 那就放入数据库(redis)中(常用)