我們知道在正常情況下,發(fā)送http請求時(shí),消息頭中會自動攜帶cookie信息,這其中就會包括SESSIONID信息,所以只要我們沒有關(guān)閉瀏覽器,消息頭中都會自動攜帶這個(gè)信息,以供服務(wù)器訪問相應(yīng)的session。 但是如果我把瀏覽器關(guān)閉了呢?這樣的話,我該如何再次訪問相應(yīng)的session呢?
我們可以這樣做,來實(shí)現(xiàn)這個(gè)需求(結(jié)合cookie)
//在servletA中設(shè)置cookie
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
session.setAttribute("name", "張三");
out.println("創(chuàng)建一個(gè)session并放入姓名屬性");
//手動添加cookie,保存JSESSIONID信息
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60*30);//設(shè)置cookie的生命周期為30min 相應(yīng) 給瀏覽器一個(gè) session id
response.addCookie(cookie);
}
//在servletB中就可以正常訪問session了
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession httpSession = request.getSession();
String name = (String) httpSession.getAttribute("name");
out.println("name = "+name);
}
我們來分析為什么可以這樣做?
首先,session的聲明周期是可以自己來設(shè)置的,默認(rèn)的是30分鐘,那么當(dāng)我們關(guān)閉瀏覽器之后,這個(gè)瀏覽器對應(yīng)的session其實(shí)還沒有消亡,(如果我們需要它消亡的話,我們可以調(diào)用invalidate方法,這也是網(wǎng)站中的安全退出常見操作之一)。既然沒有消亡,為什么關(guān)閉瀏覽器之后,我們就訪問不到了呢?那是因為cookie中的JSESSIONID信息沒有了,不會自動攜帶這個(gè)session信息了,服務(wù)器找不到對應(yīng)的session,就會自動添加新的session,這個(gè)新添加的session顯然不是我們需要的。所以,我們就可以利用cookie來實(shí)現(xiàn)這個(gè)需求。只要我們手動為cookie中添加JSESSIONID信息,那么不管你的瀏覽器是否關(guān)閉,我的cookie中都會攜帶JSESSION信息,這樣的話,服務(wù)器就一定能夠找到對應(yīng)的session,而不會重新建立一個(gè)新的session,這樣只要session沒有消亡,就一定可以訪問到對應(yīng)的session。
|