我們知道在正常情況下,發(fā)送http請(qǐng)求時(shí),消息頭中會(huì)自動(dòng)攜帶cookie信息,這其中就會(huì)包括SESSIONID信息,所以只要我們沒(méi)有關(guān)閉瀏覽器,消息頭中都會(huì)自動(dòng)攜帶這個(gè)信息,以供服務(wù)器訪問(wèn)相應(yīng)的session。
但是如果我把瀏覽器關(guān)閉了呢?這樣的話,我該如何再次訪問(wèn)相應(yīng)的session呢?
我們可以這樣做,來(lái)實(shí)現(xiàn)這個(gè)需求(結(jié)合cookie)
//在servletA中設(shè)置cookiepublic 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并放入姓名屬性"); //手動(dòng)添加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中就可以正常訪問(wèn)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); }
我們來(lái)分析為什么可以這樣做?
首先,session的聲明周期是可以自己來(lái)設(shè)置的,默認(rèn)的是30分鐘,那么當(dāng)我們關(guān)閉瀏覽器之后,這個(gè)瀏覽器對(duì)應(yīng)的session其實(shí)還沒(méi)有消亡,(如果我們需要它消亡的話,我們可以調(diào)用invalidate方法,這也是網(wǎng)站中的安全退出常見(jiàn)操作之一)。既然沒(méi)有消亡,為什么關(guān)閉瀏覽器之后,我們就訪問(wèn)不到了呢?那是因為cookie中的JSESSIONID信息沒(méi)有了,不會(huì)自動(dòng)攜帶這個(gè)session信息了,服務(wù)器找不到對(duì)應(yīng)的session,就會(huì)自動(dòng)添加新的session,這個(gè)新添加的session顯然不是我們需要的。所以,我們就可以利用cookie來(lái)實(shí)現(xiàn)這個(gè)需求。只要我們手動(dòng)為cookie中添加JSESSIONID信息,那么不管你的瀏覽器是否關(guān)閉,我的cookie中都會(huì)攜帶JSESSION信息,這樣的話,服務(wù)器就一定能夠找到對(duì)應(yīng)的session,而不會(huì)重新建立一個(gè)新的session,這樣只要session沒(méi)有消亡,就一定可以訪問(wèn)到對(duì)應(yīng)的session。
聯(lián)系客服