前幾天在做一個簽到系統(tǒng)時,遇到了喜聞樂見的session問題,項目為Spring+SpringMVC+Mybatis框架,maven管理目錄的javaweb端系統(tǒng),對于session的一些問題,作出以下分析,在這里,著重討論session生命周期的問題,至于其他定義,不做解釋:
我們提供的服務有:成都做網(wǎng)站、成都網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、吉利ssl等。為1000多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的吉利網(wǎng)站制作公司
首先,說明一下session的生命周期:
存儲:Session存儲在服務器端,一般為了防止在服務器的內(nèi)存中(為了高速存?。琒essinon在用戶訪問第一次訪問服務器時創(chuàng)建,需要注意只有訪問JSP、Servlet等程序時才會創(chuàng)建Session,只訪問HTML、IMAGE等靜態(tài)資源并不會創(chuàng)建Session。在一個javaweb應用中,可調(diào)用request.getSession(boolean xxx)生成Session。注意,boolean型參數(shù)為true時,在此處強制生成一個新的session。
1.session失效時間:
距離上一次使用該session的時間達到設置的失效時間,session失效
2.還有一種是方法 session.invalidate()被執(zhí)行,主動使得session失效
對于失效時間,可以通過配置web.xml中的屬性來定義:
失效時間
失效時間單位為分鐘,若要使session有效時間為一天,則可以設為60*24,當設置為0或負數(shù)時,session永久有效,根據(jù)失效時間的定義,很容易理解這一情況。
session為什么在瀏覽器關閉之后失效了?
根據(jù)已知的內(nèi)容,寫了一個簡單的例子:
@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)建時間 request.setAttribute("id",session.getId());//id request.setAttribute("max",session.getMaxInactiveInterval(-1));//最大失效時間 //在這里,MaxInactiveInterval的優(yōu)先級高于web.xml中的session-cofig,單位為秒 request.setAttribute("lasttime",session.getLastAccessedTime());//上次使用時間 request.setAttribute("sessionTest",session); // System.out.println(session.getCreationTime()); // System.out.println(session.getMaxInactiveInterval()); // System.out.println(session.getLastAccessedTime()); return "page/showSession"; }
創(chuàng)建時間: | ${creationtime} |
id: | ${id} |
最大存活時間: | ${max} |
上次使用時間: | ${lasttime} |
session: | ${sessionTest} |
解析:
可見,session的失效時間其實還是在瀏覽器關閉時,所以只有瀏覽器不關閉再次訪問的情況,才能繼續(xù)使用登錄狀態(tài),到底上面我們所設置的失效時間代表的是什么?
瀏覽器和服務器之間創(chuàng)建了一個Session,由于客戶端長時間(休眠時間)沒有與服務器交互,服務器將此Session銷毀,客戶端再一次與服務器交互時之前的Session就不存在了,我的理解是,失效時間只生效在一次會話過程中,若瀏覽器關閉,會話結束,其實失效時間設置為永久有效,就是到瀏覽器關閉,會話關閉的那個時刻。要解決這個問題,可以把cookie與session混用,有這么的笨辦法:
主動添加Cookie,設置保存目錄與存活時間
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); }
在再次訪問時,使用Cookie[] cookies = request.getCookies();
遍歷cookie,根據(jù)cookie的名字獲取想要的cookie,也可說是session,最后,得到了自己想要的結果,session(這個名為JSESSIONID的cookie)逃出了瀏覽器的監(jiān)禁。
總結
以上所述是小編給大家介紹的解決J2EE-session在瀏覽器關閉后失效問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對創(chuàng)新互聯(lián)網(wǎng)站的支持!