Session 是什么 ?
代表服務(wù)器與瀏覽器之間的一次會(huì)話過(guò)程卵迂,這個(gè)過(guò)程可以是連續(xù)的嚼吞,也可以是時(shí)斷時(shí)續(xù)的草慧。而在 Web 開(kāi)發(fā)語(yǔ)境下卷哩,則指一類用來(lái)在客戶端與服務(wù)器之間保持狀態(tài)的解決方案
多樣的存在形式
javax.servlet.http.HttpSession
s = requests.session()
- PHP
$_session
- Hibernate
org.hibernate interface Session
- WebLogic
Weblogic Server session
- JSP
HttpSession
為什么要有 Session ?
HTTP 本身是無(wú)狀態(tài)的监透,這與 HTTP 協(xié)議本身的目的是相符的
當(dāng)客戶每次訪問(wèn) Web 頁(yè)面桶错,服務(wù)器重新打開(kāi)新的會(huì)話時(shí),為了維護(hù)其上下文信息(記住同一個(gè)用戶)
由于此類種種場(chǎng)景胀蛮,需要讓 HTTP 協(xié)議成為有狀態(tài)的
Session 工作原理
Session 機(jī)制是一種服務(wù)器端的機(jī)制院刁,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)來(lái)保存信息
https://picture.yuzhouwan.com/2014-11-15/session.png?imageslim
踩過(guò)的坑
Session 的創(chuàng)建
不是在客戶端訪問(wèn) Server 的時(shí)候就創(chuàng)建,而是在服務(wù)器的某個(gè)構(gòu)建 Session 的語(yǔ)句被調(diào)用時(shí)
- PHP
session_start()
- JSP
內(nèi)置對(duì)象 Session
- Java
HttpServletRequest.getSession(true)
- Hibernate
new Configuration.configure("hibernate.cfg.xml").buildSessionFactory().openSesssion()
SSO(Single Sign-on)
按照 Servlet 規(guī)范醇滥,Session 的作用域應(yīng)該僅僅限于當(dāng)前應(yīng)用程序下黎比,不同的應(yīng)用程序之間是不能夠相互訪問(wèn)對(duì)方的 Session 的
各個(gè)應(yīng)用服務(wù)器從實(shí)際效果上都遵守了這一規(guī)范,但是實(shí)現(xiàn)的細(xì)節(jié)卻可能各有不同鸳玩,因此解決跨應(yīng)用程序 Session 共享的方法也不盡相同
可以借助于第三方的力量阅虫,比如使用文件、數(shù)據(jù)庫(kù)不跟、JMS 或者客戶端 cookie颓帝,URL 參數(shù)或者隱藏字段等手段
還有一種較為方便的做法,就是把一個(gè)應(yīng)用程序的 Session 放到 ServletContext 中取得前一個(gè)應(yīng)用程序的引用
歡迎直接訪問(wèn)我的個(gè)人博客窝革,閱讀效果更佳:https://yuzhouwan.com/posts/48905/