Session會話簡介
會話是指在一段時間內,用戶使用同一個瀏覽器進程與Web應用之間的交互過程。
會話(Session)通常用來跟踪用戶的狀態,緩存用戶在此瀏覽器進程中的信息。
當用戶關閉瀏覽器,上一個Session也就無法再次獲得了(Cookie的maxAge為-1的情況)。再次打開新的瀏覽器,將開始一個新的會話。
類javax.servlet.http.HttpSession。每一個HttpSession代表用戶的一個會話。
每一個Session的過期時間默認為30分鐘。
當瀏覽器第一次訪問服務器時,無論先訪問哪一個頁面,服務器就會給用戶分配一個唯一的會話標識,即jsessionid然後以cookie的形式返回給用戶。
下圖是一個響應頭(下圖是基於Servlet3.0的,在Servlet2.5中沒有HttpOnly屬性)
服務器給每個用戶創建一個會話,即HttpSession對象,保存在服務器端。
那麼,當用戶再次訪問服務器時,服務器是如何知道還是當前用戶呢?
當瀏覽器再次訪問服務器時,會攜帶包含了jsessionid的cookie訪問服務器。服務器根據此id返回此用戶的HttpSession對象,就保持了會話。
( 那麼,是否可以在不同的瀏覽器上實現同一個同一個會話呢?
下面是一個典型的URL,它帶有一定的欺騙作用,可以在不同的瀏覽器上實現同一個會話:
http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C )
瀏覽器和服務器的關係如下兩圖:
HttpSession:
在Servlet中,通過HttpServletRequest.getSession方法獲取會話對像。
HttpSession接口的以下方法用於向會話範圍內共享數據:
getAttribute(“name”)setAttribute(“name”,object);getAttributeNames()removeAttrubute(“name”)
Invalidate(); - 此方法強力刪除服務器緩存的session.
示例:
在一個Servlet的向httpSession中setAttribute設置某些值。
通過超連接,或其他方式轉到其他servlet並通過getAttribute顯示信息。
在任意Servlet中調用getAttribute顯示信息。
關閉此瀏覽器,重新訪問獲取信息的servlet,你會發現已經沒有信息了。
如下:
String name=request.getParameter("name"); request.setAttribute("name", "request---"+name); request.getSession().setAttribute("name", "session---"+name); getServletContext().setAttribute("name", "application---"+name); Session的唯一標識Id:
每一個Session都一個唯一標識,即ID。
當瀏覽器獲取一個新的Session時,用戶即可以通過session.geId();打印出ID的值。
在不關閉瀏覽器的情況下,在多個頁面上跳轉,使用的是同一個Session。
如:
request.getSession().getId()
何為安全退出:
用戶退出時,應該當將自己的信息從Session中清除-即安全退出。
安全退出是為了將自己在服務器上留下的信息清除乾淨,以防被黑
Session.invalidate();
1、request.getSession().invalidate();
如此可將session池中的相對應的對象刪除
2、Session.removeAttribute(…)
如:
request.getSession().removeAttribute("realCode");
用於刪除session對像中的屬性
通過重寫URL來跟踪會話:
前面已經說過,Servlet容器先在客戶端保存一個SessionID,以後,在瀏覽器發出HTTP請求時,都會包含這個SessionID.Servlet容器讀取HTTP請求中的這個SessionID,根據這個SessionID從容器中取出HttpSession對像,以便於跟踪HTTP請求屬於哪一個會話,這一過程稱為會話的跟踪。
如果瀏覽器支持Cookie,Servlet容器就將SessionID作為Cookie保存在瀏覽器的客戶端。但如果出於安全的考慮,用戶禁用了Cookie,那麼Servlet容器又如何來跟踪會話呢?
首先讓我們在IE中禁用Cookie(注意:對於某些GHOST的系統不起作用)。
IE>工具>Internet選項>隱私>高級,然後禁用Cookie:
我們可以在主頁加上這樣的超鏈接:(與下面代碼中相關的SaveServlet.java GetServlet.java LogoutServlet.java的代碼我放在最後面貼)
<h2>演示重寫url技術---破解用戶禁用cookie之後,我們session無效的問題</h2> <form action="<%=response.encodeURL("saveServlet") %>" method="post"> name:<input type="text" name="name"/><br/> <input type="submit"/> </form> <a href="<%=response.encodeURL("getServlet") %>">重寫url-讀取幾個容器中的數據</a><br/> <a href="<%=response.encodeURL("logoutServlet") %>">重寫url-安全退出</a>這句<form action=“<%=response.encodeURL(“/aa”)%>”>就可以實現這一功能
在這裡禁用了cookie以後,瀏覽器仍然能夠接收到服務器發送過來的cookie,但是瀏覽器只能接受不能發送出去給服務器,不能發送cookie的話也就不能夠去session池中去取相應的對象了。
上面的代碼在表單裡面輸入想要的值之後,再到下面的getServlet這裡的超鏈接處訪問看是不是仍然能夠顯示出輸入的值,答案是肯定的。這裡的訪問路徑就相當於類似
http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C 的,後面帶的jsessionid=F8692D61CD46D094DBB7A8FC7387649C就是其id,如此,你到另一個瀏覽器中去輸入這個網址也能夠訪問的到。
這裡我要補充一下:(以下情況是在我將session池中HttpSession對象將對應session的JSESSIONID值和value值寫入cookie中,這個cookie會覆蓋系統造的那個,就相當於是我自己造的,我將存在時間設置成了十分鐘,如果不覆蓋的話,cookie在瀏覽器關閉時就會消亡,下面的現像也就不會出現了)
在是否禁用了cookie這兩種情況下在session池中新建的對象的id是不一樣的,即假如你在禁用了cookie時在表單中輸入了一個name的值,查詢結果如下:
並且jsessionid為2BB51EBDEAAF14D19656C71E1B6F9FF6
然後馬上換成不禁用cookie模式,輸入另一個名字如Tom,查詢結果自然會是兩個Tom,jsessionid為
203F9E4DB5D874476B81DAF350661B6A,與禁用是不一樣,這就使出現下面的結果了
然後此時我們將瀏覽器關閉,再次進入瀏覽器,在不禁用cookie模式下查看訪問結果,如下:
下面我將主要的代碼貼上來:
SaveServlet.java
package cn.hncu.servlets.session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SaveServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); request.setCharacterEncoding("utf-8"); String name=request.getParameter("name"); request.setAttribute("name", "request---"+name); request.getSession().setAttribute("name", "session---"+name); getServletContext().setAttribute("name", "application---"+name); //把cookie技術和session技術聯合起來做應用的一個例子---※功能:讓用戶在關閉瀏覽器之後,如果10分鐘之內能夠登錄本站,還能訪問到session中的信息//向客戶端寫一個key為"JSESSIONID"用value為sessionid的cookie, Cookie c=new Cookie("JSESSIONID", request.getSession().getId()); c.setMaxAge(60*10);//上面的現象就是這一句造成的,沒有這一句的話就不會有上面說的現象了c.setPath(request.getContextPath()); response.addCookie(c); out.println("保存成功..."); out.flush(); out.close(); } }GetServlet.java
package cn.hncu.servlets.session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class GetServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); String reqName=(String) request.getAttribute("name"); String seName=(String) request.getSession().getAttribute("name"); String appName=(String) getServletContext().getAttribute("name"); out.println(reqName+"<br/>"); out.println(seName+"<br/>"); out.println(appName+"<br/>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } }LogoutServlet.java
package cn.hncu.servlets.session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LogoutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); //安全退出---只要讓session對象無效就可以了request.getSession().invalidate(); out.println("已安全退出..."); } }以上所述是小編給大家介紹的JavaWeb Session 會話管理,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!