Java Web 项目学习(二) 会话管理
Cookie
- 新建cookie对象,初始化必须有参数 Cookie cookie = new Cookie("name","value"); 都是String类型
- 设置路径生效范围 cookie.setPath("path")
- 设置生存时间(s) cookie.setMaxAge(10)
- 发送 response.addCookie(cookie);
- 取对应name的Cookie的值。 @CookieValue("code") String code
- 缺点:不太安全、每次发送耗费流量。只能存少量数据(需要来回传递,影响性能),只能存字符串(客户端识别字符串,其他类型不一定)。
/** * cookie 示例 */ @RequestMapping(path = "/cookie/set", method = RequestMethod.GET) @ResponseBody public String setCookie(HttpServletResponse response){ //创建cookie,将cookies存到Response对象中。 Cookie cookie = new Cookie("code", CommunityUtil.generateUUID()); //设置生效的范围,明确声明cookies在那些路径下有效。节省网络资源 cookie.setPath("/community/alpha"); //在这个路径已经子路径下有用。 //设置生存时间(存在硬盘中,长期有效)。默认情况存在内存中,浏览器关闭消失。 cookie.setMaxAge(60 *10); //60s*10 //发送cookie response.addCookie(cookie); return "set cookie"; } @RequestMapping(path = "/cookie/get", method = RequestMethod.GET) @ResponseBody public String getCookie(@CookieValue("code") String code){ System.out.println(code); return "get cookie"; }
通过以上,可以看到Cookie第一次访问时在response的header中给出
不在范围路径下的没有code,
Session
对于浏览器访问服务器在服务器端,创建一个Session。因为有多个浏览器,因此Session也有多个。如何将Session与浏览器一一对应,就用到了Cookie。因此Session本质上式依赖于cookie的。
在响应时,服务器自动向浏览器发送数据,通过cookie携带(服务器底层自动建立cookie,在cookie中存SessionId)。浏览器存cookie,下次请求时会发送给服务器,服务器通过sessionId找到对应的session。
- Session 不需要手动创建,SpringMVC 会自动创建并注入。类似于 Request,Respond, Model
- 因为Session是一直存在于服务端的,因此可以存任何类型的数据。Cookie只能字符串少量数据。因为需要来回传,影响性能
- 优点:安全。缺点:服务端压力。
/** * Session 示例 */ @RequestMapping(path = "/session/set", method = RequestMethod.GET) @ResponseBody public String setSession(HttpSession session){ //Session 不需要手动创建,SpringMVC 会自动创建并注入。 //类似于 Request,Respond, Model //因为Session是一直存在于服务端的,因此可以存任何类型的数据。Cookie只能字符串少量数据。因为需要来回传,影响性能。 session.setAttribute("id","1"); session.setAttribute("name","test"); return "set 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"; }
注意:这里只在第一次访问的时候显示。重复访问不会显示了就。
使用Cookie还是Session?
- 能用Cookie就用Cookies,减少服务端压力。
- 没有必要存的,不要存。
- Session对于单体服务器可以随意使用。多服务器(分布式部署)基本不用。会有问题。多个服务器会有多个session。
- 粘性Session(浏览器请求绑定一个固定服务器) 缺点:负载不够均衡.
- 同步Session(每个浏览器同步Session) 缺点:1同步对性能有影响,2服务器之间会产生耦合,不利于部署。
- 共享Session(专门找一个服务器存Session,其他服务器向这台服务器申请Session) 缺点:单体服务器的瓶颈,万一挂了?搞集群的话,与同步Session相同。
- 尽量不存Session中,能存Cookie存Cookie。对于敏感数据存到数据库中。
缺点:大部分常用的的关系型数据库,数据存在硬盘中。与内存直接读数据,性能较慢。数据量大会成为瓶颈。 -
因此将数据存到Redis中较好。即尽量不存Session,能存Cookie存Cookie。对于敏感数据存到Redis。