解決J2EE-session在瀏覽器關(guān)閉后失效問(wèn)題
前幾天在做一個(gè)簽到系統(tǒng)時(shí),遇到了喜聞樂(lè)見(jiàn)的session問(wèn)題,項(xiàng)目為Spring+SpringMVC+Mybatis框架,maven管理目錄的javaweb端系統(tǒng),對(duì)于session的一些問(wèn)題,作出以下分析,在這里,著重討論session生命周期的問(wèn)題,至于其他定義,不做解釋:
首先,說(shuō)明一下session的生命周期:
存儲(chǔ):Session存儲(chǔ)在服務(wù)器端,一般為了防止在服務(wù)器的內(nèi)存中(為了高速存?。?,Sessinon在用戶訪問(wèn)第一次訪問(wèn)服務(wù)器時(shí)創(chuàng)建,需要注意只有訪問(wèn)JSP、Servlet等程序時(shí)才會(huì)創(chuàng)建Session,只訪問(wèn)HTML、IMAGE等靜態(tài)資源并不會(huì)創(chuàng)建Session。在一個(gè)javaweb應(yīng)用中,可調(diào)用request.getSession(boolean xxx)生成Session。注意,boolean型參數(shù)為true時(shí),在此處強(qiáng)制生成一個(gè)新的session。
1.session失效時(shí)間:
距離上一次使用該session的時(shí)間達(dá)到設(shè)置的失效時(shí)間,session失效
2.還有一種是方法 session.invalidate()被執(zhí)行,主動(dòng)使得session失效
對(duì)于失效時(shí)間,可以通過(guò)配置web.xml中的屬性來(lái)定義:
<session-config> <session-timeout>失效時(shí)間</session-timeout> </session-config>
失效時(shí)間單位為分鐘,若要使session有效時(shí)間為一天,則可以設(shè)為60*24,當(dāng)設(shè)置為0或負(fù)數(shù)時(shí),session永久有效,根據(jù)失效時(shí)間的定義,很容易理解這一情況。
session為什么在瀏覽器關(guān)閉之后失效了?
- 未設(shè)置session失效時(shí)間,默認(rèn)為瀏覽器關(guān)閉后失效;
- 大部分的session機(jī)制都是采用進(jìn)程中的cookie來(lái)保存sessionid的,也就是JSESSIONID,瀏覽器關(guān)閉后進(jìn)程消失,進(jìn)程中的cookie消失,那么sessionid也就跟著消失了。
根據(jù)已知的內(nèi)容,寫了一個(gè)簡(jiǎn)單的例子:
@Controller public class SessionTest { @RequestMapping("/sessionTest") public String sessionTest(HttpServletRequest request, HttpServletResponse response){ System.out.println("success!"); HttpSession session = request.getSession(); session.setMaxInactiveInterval(259200); request.setAttribute("creationtime",session.getCreationTime());//創(chuàng)建時(shí)間 request.setAttribute("id",session.getId());//id request.setAttribute("max",session.getMaxInactiveInterval(-1));//最大失效時(shí)間 //在這里,MaxInactiveInterval的優(yōu)先級(jí)高于web.xml中的session-cofig,單位為秒 request.setAttribute("lasttime",session.getLastAccessedTime());//上次使用時(shí)間 request.setAttribute("sessionTest",session); // System.out.println(session.getCreationTime()); // System.out.println(session.getMaxInactiveInterval()); // System.out.println(session.getLastAccessedTime()); return "page/showSession"; } <table border="1" cellspacing="0" cellpadding="0"> <tr><td>創(chuàng)建時(shí)間:</td><td>${creationtime}</td></tr> <tr><td>id:</td><td>${id}</td></tr> <tr><td>最大存活時(shí)間:</td><td>${max}</td></tr> <tr><td>上次使用時(shí)間:</td><td>${lasttime}</td></tr> <tr><td>session:</td><td>${sessionTest}</td></tr> </table>
解析:
- 上面的代碼模擬了一次登錄情況,控制器中,創(chuàng)建了一個(gè)HttpSession對(duì)象,基本設(shè)置了所有能設(shè)置的參數(shù),
- 但是在瀏覽器關(guān)閉后,再次進(jìn)入主頁(yè)面時(shí),還是需要再次登錄,說(shuō)明瀏覽器端是沒(méi)有再次拿到這個(gè)session對(duì)象的,我們可以在chrome瀏覽器的設(shè)置->顯示高級(jí)設(shè)置->隱私設(shè)置的內(nèi)容設(shè)置->所有cookie與網(wǎng)站數(shù)據(jù)中,搜索本地tomcat服務(wù)器去查看本次存入的session,即一個(gè)名為JSESSIONID的cookie,情況如下
可見(jiàn),session的失效時(shí)間其實(shí)還是在瀏覽器關(guān)閉時(shí),所以只有瀏覽器不關(guān)閉再次訪問(wèn)的情況,才能繼續(xù)使用登錄狀態(tài),到底上面我們所設(shè)置的失效時(shí)間代表的是什么?
瀏覽器和服務(wù)器之間創(chuàng)建了一個(gè)Session,由于客戶端長(zhǎng)時(shí)間(休眠時(shí)間)沒(méi)有與服務(wù)器交互,服務(wù)器將此Session銷毀,客戶端再一次與服務(wù)器交互時(shí)之前的Session就不存在了,我的理解是,失效時(shí)間只生效在一次會(huì)話過(guò)程中,若瀏覽器關(guān)閉,會(huì)話結(jié)束,其實(shí)失效時(shí)間設(shè)置為永久有效,就是到瀏覽器關(guān)閉,會(huì)話關(guān)閉的那個(gè)時(shí)刻。要解決這個(gè)問(wèn)題,可以把cookie與session混用,有這么的笨辦法:
主動(dòng)添加Cookie,設(shè)置保存目錄與存活時(shí)間
public static void addCookie(String name, String value, int age, HttpServletResponse response) throws UnsupportedEncodingException { Cookie c = new Cookie(name, URLEncoder.encode(value, "utf-8")); c.setMaxAge(age); c.setPath(path); response.addCookie(c); }
在再次訪問(wèn)時(shí),使用Cookie[] cookies = request.getCookies();
遍歷cookie,根據(jù)cookie的名字獲取想要的cookie,也可說(shuō)是session,最后,得到了自己想要的結(jié)果,session(這個(gè)名為JSESSIONID的cookie)逃出了瀏覽器的監(jiān)禁。
總結(jié)
以上所述是小編給大家介紹的解決J2EE-session在瀏覽器關(guān)閉后失效問(wèn)題,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Java 9中如何對(duì)IntegerCache進(jìn)行修改詳解
這篇文章主要給大家介紹了關(guān)于Java 9中如何對(duì)IntegerCache進(jìn)行修改的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用java9具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。2017-12-12mybatisplus如何解決分頁(yè)最多500條數(shù)據(jù)
這篇文章主要介紹了mybatisplus如何解決分頁(yè)最多500條數(shù)據(jù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Springboot實(shí)現(xiàn)人臉識(shí)別與WebSocket長(zhǎng)連接的實(shí)現(xiàn)代碼
這篇文章主要介紹了Springboot實(shí)現(xiàn)人臉識(shí)別與WebSocket長(zhǎng)連接的實(shí)現(xiàn),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11微信支付之公眾號(hào)支付(java實(shí)現(xiàn))
這篇文章主要介紹了微信支付之公眾號(hào)支付(java實(shí)現(xiàn)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Java循環(huán)結(jié)構(gòu)之多重循環(huán)及continue?break
這篇文章主要介紹了Java循環(huán)結(jié)構(gòu)之多重循環(huán)及continue?break,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09Spring中的@ExceptionHandler異常攔截器
這篇文章主要介紹了Spring中的@ExceptionHandler異常攔截器,Spring的@ExceptionHandler可以用來(lái)統(tǒng)一處理方法拋出的異常,給方法加上@ExceptionHandler注解,這個(gè)方法就會(huì)處理類中其他方法拋出的異常,需要的朋友可以參考下2024-01-01spring/springboot整合curator遇到的坑及解決
這篇文章主要介紹了spring/springboot整合curator遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05