Session 是什么 ?
代表服務(wù)器與瀏覽器之間的一次會話過程,這個過程可以是連續(xù)的,也可以是時斷時續(xù)的。而在 Web 開發(fā)語境下,則指一類用來在客戶端與服務(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 本身是無狀態(tài)的,這與 HTTP 協(xié)議本身的目的是相符的
當(dāng)客戶每次訪問 Web 頁面,服務(wù)器重新打開新的會話時,為了維護其上下文信息(記住同一個用戶)
由于此類種種場景,需要讓 HTTP 協(xié)議成為有狀態(tài)的
Session 工作原理
Session 機制是一種服務(wù)器端的機制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)來保存信息
https://picture.yuzhouwan.com/2014-11-15/session.png?imageslim
踩過的坑
Session 的創(chuàng)建
不是在客戶端訪問 Server 的時候就創(chuàng)建,而是在服務(wù)器的某個構(gòu)建 Session 的語句被調(diào)用時
- PHP
session_start()
- JSP
內(nèi)置對象 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)用程序之間是不能夠相互訪問對方的 Session 的
各個應(yīng)用服務(wù)器從實際效果上都遵守了這一規(guī)范,但是實現(xiàn)的細節(jié)卻可能各有不同,因此解決跨應(yīng)用程序 Session 共享的方法也不盡相同
可以借助于第三方的力量,比如使用文件、數(shù)據(jù)庫、JMS 或者客戶端 cookie,URL 參數(shù)或者隱藏字段等手段
還有一種較為方便的做法,就是把一個應(yīng)用程序的 Session 放到 ServletContext 中取得前一個應(yīng)用程序的引用
歡迎直接訪問我的個人博客,閱讀效果更佳:https://yuzhouwan.com/posts/48905/