我們知道卵佛,會(huì)話是一種機(jī)制杨赤,用于跟蹤客戶狀態(tài)的普遍解決方案。在網(wǎng)站上一系列的動(dòng)作可構(gòu)成一個(gè)會(huì)話级遭,比如望拖,登陸查看郵件系統(tǒng)渺尘,寫信發(fā)信挫鸽,最后退出,整個(gè)過程鸥跟。
對(duì)于瀏覽器訪問服務(wù)器來說丢郊,Servlet容器會(huì)創(chuàng)建HttpSession會(huì)話。當(dāng)然医咨,這前提是需要瀏覽器支持會(huì)話枫匾,可以在jsp中控制(而不是在瀏覽器中設(shè)置來控制,即不受用戶控制拟淮,對(duì)用戶是透明的)干茉。會(huì)話不會(huì)一直存在,也會(huì)銷毀很泊。具體如下:
會(huì)話過期具有的意義:
1角虫、長時(shí)間會(huì)話不活動(dòng),及時(shí)銷毀委造,可以釋放無效HttpSession對(duì)象占用的內(nèi)存空間戳鹅;
2、防止未授權(quán)的用戶訪問會(huì)話昏兆,當(dāng)用戶長時(shí)間不操作枫虏,會(huì)話結(jié)束,就要重新登陸(防止偷窺)。
注意: 即使web應(yīng)用被終止隶债,會(huì)話不會(huì)被銷毀腾它,而是被Tomcat持久化到永久性存儲(chǔ)設(shè)備中,當(dāng)web重啟后死讹,Tomcat會(huì)重新加載會(huì)話携狭。(這些都不用開發(fā)者關(guān)心,Tomcat和Servlet容器替開發(fā)者做了太多的事情回俐,甚至開發(fā)者都不知道逛腿,我以前就是這樣,仅颇,太強(qiáng)大有木有)单默。
——————
對(duì)于JSP來說,Servlet容器提供了隱含的HttpSession對(duì)象忘瓦,jsp可以直接通過固定引用變量來引用HttpSession對(duì)象搁廓,對(duì)√,就是直接用耕皮。你不用管它怎么創(chuàng)建的境蜕,甚至哪里來的,直接用凌停!(當(dāng)然粱年,這些都是Servlet容器悄悄的幫你做了)
會(huì)話范圍與HttpSession對(duì)象的生命周期對(duì)應(yīng),因此web應(yīng)用如果能夠共享一個(gè)HttpSession對(duì)象罚拟,也就能共享會(huì)話范圍內(nèi)的共享數(shù)據(jù)台诗。
對(duì)于xxxServlet,可以從HttpServletRequest對(duì)象中獲取HttpSession對(duì)象赐俗。
——————
session和cookie拉队??
cookie是一種客戶端和服務(wù)器端傳輸數(shù)據(jù)的一種手段阻逮,用于標(biāo)識(shí)同一個(gè)session(比如JSESSIONID粱快,它是cookie的一個(gè)key,用來標(biāo)識(shí)一次session叔扼,cookie的value就是sessionid)事哭。坦白的說,cookie什么都不是币励,只是一種名稱慷蠕,叫其他什么都無所謂,只是這種名稱已經(jīng)變成標(biāo)準(zhǔn)了食呻。
延伸:
我們知道流炕,HTTP是無狀態(tài)的協(xié)議澎现,而現(xiàn)在流行的微服務(wù)架構(gòu),都在講無狀態(tài)每辟,上面的session和cookie的目的是為了達(dá)到有狀態(tài)的會(huì)話剑辫,為了記錄是哪個(gè)用戶的哪個(gè)瀏覽器所執(zhí)行的這一組操作。這不是矛盾嗎渠欺?妹蔽?筆者現(xiàn)在的理解是,確實(shí)矛盾挠将。通過前面的了解胳岂,如果瀏覽器首次訪問時(shí),服務(wù)器端會(huì)響應(yīng)寫一個(gè)cookie到瀏覽器舔稀,讓后在這一個(gè)瀏覽器進(jìn)程內(nèi)乳丰,瀏覽器后面發(fā)的請(qǐng)求都會(huì)自動(dòng)地(注意是自動(dòng)的)帶上服務(wù)器端生成的cookie。然而内贮,使用過REST API編程或者postman客戶端的童鞋都有經(jīng)歷产园,那就是這些都不能自動(dòng)地保存服務(wù)器端生成的cookie,并且也不會(huì)再次訪問時(shí)自動(dòng)地帶上夜郁。(客戶端是什么樣的永遠(yuǎn)不會(huì)影響服務(wù)器端的什燕,服務(wù)器端該做什么該做什么,這里唯一變化的就是客戶端變了竞端,不再自動(dòng)地的維持session了屎即。導(dǎo)致這樣一個(gè)問題,即使你連續(xù)的請(qǐng)求相隔時(shí)間再短婶熬,服務(wù)器端總會(huì)認(rèn)為你是一個(gè)嶄新的客戶端剑勾,所以微服務(wù)就必須要做成無狀態(tài)的埃撵,每一次請(qǐng)求都是獨(dú)立的赵颅,因?yàn)樗鼜谋举|(zhì)上就不能夠支持有狀態(tài),就不能夠維持會(huì)話暂刘,你的所有的請(qǐng)求都必須毫不相干饺谬,起碼不能有任何的會(huì)話的機(jī)制在里面)。
原來谣拣,瀏覽器也悄悄地幫你做了很多事情(都是HTTP的規(guī)約)募寨。。森缠。而這些事情像postman這樣的rest客戶端卻沒有幫你做拔鹰,你自己編程訪問rest api也沒有做。
為什么贵涵?是不能做嗎列肢,肯定不是咯恰画。我想可能有三點(diǎn),一是增加開發(fā)的難度瓷马,加大了系統(tǒng)的復(fù)雜度拴还;二是系統(tǒng)需要維護(hù)會(huì)話的開銷,對(duì)于靈活小巧的微服務(wù)來講欧聘,顯然是相悖的片林;三是考慮到微服務(wù)應(yīng)用所在的宿主機(jī)down掉了,不能在另一臺(tái)宿主機(jī)迅速拉起就能服務(wù)怀骤,因?yàn)橐獮閿?shù)據(jù)的一致性考慮费封,增加一致性解決方案。
以上均屬于筆者臆想蒋伦,不對(duì)之處孝偎,歡迎指正!