Session基础
HttpSession
- 使用Cookie有一個(gè)非常大的局限,就是如果Cookie很多,則無(wú)形的增加了客戶(hù)端與服務(wù)端的數(shù)據(jù)傳輸量。而且由于瀏覽器對(duì)Cookie數(shù)量的限制,注定我們不能再Cookie中保存過(guò)多的信息,于是Session出現(xiàn)。
- Session的作用就是在服務(wù)器端保存一些用戶(hù)的數(shù)據(jù),然后傳遞給用戶(hù)一個(gè)名字為JSESSIONID的Cookie,這個(gè)JESSIONID對(duì)應(yīng)這個(gè)服務(wù)器中的一個(gè)Session對(duì)象,通過(guò)它就可以獲取到保存用戶(hù)信息的Session。
Session的工作原理
Session的創(chuàng)建
- Session的創(chuàng)建時(shí)機(jī)是在request.getSession()方法第一次被調(diào)用時(shí)。
- Session被創(chuàng)建后,同時(shí)還會(huì)有一個(gè)名為JSESSIONID的Cookie被創(chuàng)建。
- 這個(gè)Cookie的默認(rèn)時(shí)效就是當(dāng)前會(huì)話(huà)。
Session的使用
- Session被創(chuàng)建后,對(duì)應(yīng)的Cookie被保存到瀏覽器中,之后瀏覽器每次訪(fǎng)問(wèn)項(xiàng)目時(shí)都會(huì)攜帶該Cookie。
- 當(dāng)我們?cè)俅握{(diào)用時(shí)會(huì)根據(jù)該JSESSIONID獲取已經(jīng)存在的Cookie,而不是在創(chuàng)建一個(gè)新的Cookie。
- 如果Cookie中有JSESSIONID,但是JSESSIONID沒(méi)有對(duì)應(yīng)的Session存在,則會(huì)重新創(chuàng)建一個(gè)HttpSession對(duì)象,并重新設(shè)置JSESSIONID。
Session時(shí)效
- 基本原則
- Session對(duì)象在服務(wù)器端不能長(zhǎng)期保存,它是有時(shí)間限制的,超過(guò)一定時(shí)間沒(méi)有被訪(fǎng)問(wèn)過(guò)的Session對(duì)象就應(yīng)該釋放掉,以節(jié)約內(nèi)存。所以Session的有效時(shí)間并不是從創(chuàng)建對(duì)象開(kāi)始計(jì)時(shí),到指定時(shí)間后釋放——而是從最后一次被訪(fǎng)問(wèn)開(kāi)始計(jì)時(shí),統(tǒng)計(jì)其“空閑”的時(shí)間。
- 默認(rèn)設(shè)置
- 在全局web.xml中能夠找到如下配置:
說(shuō)明Session對(duì)象默認(rèn)的最長(zhǎng)有效時(shí)間為30分鐘。
手工設(shè)置
- session.setMaxInactiveInterval(int seconds)
- session.getMaxInactiveInterval()
強(qiáng)制失效
- session.invalidate()
- 可以使Session對(duì)象釋放的情況
- Session對(duì)象空閑時(shí)間達(dá)到了目標(biāo)設(shè)置的最大值,自動(dòng)釋放
- Session對(duì)象被強(qiáng)制失效
- Web應(yīng)用卸載
- 服務(wù)器進(jìn)程停止
URL重寫(xiě)
- 在整個(gè)會(huì)話(huà)控制技術(shù)體系中,保持JSESSIONID的值主要通過(guò)Cookie實(shí)現(xiàn)。但Cookie在瀏覽器端可能會(huì)被禁用,所以我們還需要一些備用的技術(shù)手段,例如:URL重寫(xiě)。
- URL重寫(xiě)其實(shí)就是將JSESSIONID的值以固定格式附著在URL地址后面,以實(shí)現(xiàn)保持JSESSIONID,進(jìn)而保持會(huì)話(huà)狀態(tài)。這個(gè)固定格式是:URL;jsessionid=xxxxxxxxx
- 例如:targetServlet;jsessionid=F9C893D3E77E3E8329FF6BD9B7A09957
實(shí)現(xiàn)方式:
- response.encodeURL(String)
- response.encodeRedirectURL(String)
Session的活化和鈍化
- Session機(jī)制很好的解決了Cookie的不足,但是當(dāng)訪(fǎng)問(wèn)應(yīng)用的用戶(hù)很多時(shí),服務(wù)器上就會(huì)創(chuàng)建非常多的Session對(duì)象,如果不對(duì)這些Session對(duì)象進(jìn)行處理,那么在Session失效之前,這些Session一直都會(huì)在服務(wù)器的內(nèi)存中存在。那么就,就出現(xiàn)了Session活化和鈍化的機(jī)制。
- Session鈍化:Session在一段時(shí)間內(nèi)沒(méi)有被使用時(shí),會(huì)將當(dāng)前存在的Session對(duì)象序列化到磁盤(pán)上,而不再占用內(nèi)存空間。
- Session活化:Session被鈍化后,服務(wù)器再次調(diào)用Session對(duì)象時(shí),將Session對(duì)象由磁盤(pán)中加載到內(nèi)存中使用。
- 如果希望Session域中的對(duì)象也能夠隨Session鈍化過(guò)程一起序列化到磁盤(pán)上,則對(duì)象的實(shí)現(xiàn)類(lèi)也必須實(shí)現(xiàn)java.io.Serializable接口。不僅如此,如果對(duì)象中還包含其他對(duì)象的引用,則被關(guān)聯(lián)的對(duì)象也必須支持序列化,否則會(huì)拋出異常:java.io.NotSerializableException
轉(zhuǎn)載于:https://www.cnblogs.com/mazhitao/p/7436724.html
總結(jié)
- 上一篇: ios改变字体
- 下一篇: [Step By Step]SAP HA