狀態(tài)保持
- 店員很厲害,能記住每位顧客的消費(fèi)數(shù)量鹉究,只要顧客一走進(jìn)咖啡店宇立,店員就知道該怎么對待了。這種做法就是協(xié)議本身支持狀態(tài)自赔。
- 發(fā)給顧客一張卡片妈嘹,上面記錄著消費(fèi)者信息,一般還有個有效期限绍妨。這種做法就是在客戶端保持狀態(tài)润脸。
- 發(fā)給顧客一張會員卡柬脸,只記錄卡號,每次消費(fèi)時店員在店里的系統(tǒng)上匹配卡號對應(yīng)的客戶信息毙驯。這種做法就是在服務(wù)器端保持狀態(tài)倒堕。
由于HTTP協(xié)議是無狀態(tài)的,第一種無效爆价。cookie是在客戶端保持狀態(tài)的方案垦巴,而session機(jī)制是在服務(wù)器端保持狀態(tài)的方案。
session
- 創(chuàng)建: request.getSession 不存在就創(chuàng)建
- 銷毀: 過期或者調(diào)用HttpSession.invalidate();
服務(wù)器創(chuàng)建session出來后铭段,會把session的id號骤宣,以cookie的形式回寫給客戶機(jī);所以cookie需要保存session的id序愚;請求的時候會帶有cookie信息
cookie被禁用后可以通過URL重寫
- response.encodeRedirectURL(java.lang.String url) 用于對sendRedirect方法后的url地址進(jìn)行重寫憔披。
- response.encodeURL(java.lang.String url)用于對表單action和超鏈接的url地址進(jìn)行重寫
這兩個方法非常智能,當(dāng)檢測到瀏覽器沒有禁用cookie時爸吮,那么就不進(jìn)行URL重寫了芬膝。
String url = response.encodeRedirectURL(request.getContextPath()+"/servlet/ListCartServlet");
System.out.println(url);
response.sendRedirect(url);
集群 session
在集群環(huán)境中不同節(jié)點(diǎn)session不一致的問題
方式 | 缺點(diǎn) |
---|---|
粘性session: 將用戶分發(fā)到指定服務(wù)器 | 喪失容災(zāi)性而且影響性能 |
客戶端保存:使用cookie保存所有session信息 | 不安全,提供傳輸成本 |
節(jié)點(diǎn)間復(fù)制:服務(wù)器做session復(fù)制 | 性能隨著服務(wù)器增加急劇下降 |
集中式管理:使用其它存儲形娇,如DB,內(nèi)存锰霜,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