状态保持
- 店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。
- 发给顾客一张卡片,上面记录着消费者信息,一般还有个有效期限。这种做法就是在客户端保持状态。
- 发给顾客一张会员卡,只记录卡号,每次消费时店员在店里的系统上匹配卡号对应的客户信息。这种做法就是在服务器端保持状态。
由于HTTP协议是无状态的,第一种无效。cookie是在客户端保持状态的方案,而session机制是在服务器端保持状态的方案。
session
- 创建: request.getSession 不存在就创建
- 销毁: 过期或者调用HttpSession.invalidate();
服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机;所以cookie需要保存session的id;请求的时候会带有cookie信息
cookie被禁用后可以通过URL重写
- response.encodeRedirectURL(java.lang.String url) 用于对sendRedirect方法后的url地址进行重写。
- response.encodeURL(java.lang.String url)用于对表单action和超链接的url地址进行重写
这两个方法非常智能,当检测到浏览器没有禁用cookie时,那么就不进行URL重写了。
String url = response.encodeRedirectURL(request.getContextPath()+"/servlet/ListCartServlet");
System.out.println(url);
response.sendRedirect(url);
集群 session
在集群环境中不同节点session不一致的问题
方式 | 缺点 |
---|---|
粘性session: 将用户分发到指定服务器 | 丧失容灾性而且影响性能 |
客户端保存:使用cookie保存所有session信息 | 不安全,提供传输成本 |
节点间复制:服务器做session复制 | 性能随着服务器增加急剧下降 |
集中式管理:使用其它存储,如DB,内存,NFS(Network File System) | 额外定制;序列化问题 |
spring session
http://docs.spring.io/spring-session/docs/current/reference/html5/guides/httpsession.html#how-does-it-work
http://projects.spring.io/spring-session/#quick-start
参考
http://suhuanzheng7784877.iteye.com/blog/968913
http://blog.sina.com.cn/s/blog_495697e6010143tj.html