Session

還是由於HTTP協議連接的無狀態性,才使得session的不得已而產生。既然Web應用並不瞭解有關同一用戶以前請求的信息,那麼解決這個問題的一個辦法是使用Servlet/JSP容器提供的會話跟蹤功能,Servlet API規範定義了一個簡單的HttpSession接口,通過它我們可以方便地實現會話跟蹤。

  HttpSession接口提供了存儲和返回標準會話屬性的方法。標準會話屬性如會話標識符、應用數據等,都以“名字-值”對的形式保存在服務器端。也就是說,HttpSession接口提供了一種把對象保存到內存、在同一用戶的後繼請求中提取這些對象的標準辦法。在會話中保存數據的方法是setAttribute(String s, Object o),從會話提取原來所保存對象的方法是getAttribute(String s)。

  在服務器端,每當新用戶請求一個使用了HttpSession對象的JSP頁面,Servlet/JSP容器除了發回應答頁面之外,它還要以cookie的形式向瀏覽器發送一個特殊的數字。這個特殊的數字稱爲“會話標識符”,它是一個唯一的用戶標識符。此後,HttpSession對象就駐留在內存之中(這當然是在服務器端),瀏覽器再請求session時,服務器會先得到它的sessionid,再作處理。

  在客戶端,瀏覽器保存會話標識符,並在每一個後繼請求中把這個會話標識符發送給服務器。會話標識符告訴JSP容器當前請求不是用戶發出的第一個請求,服務器以前已經爲該用戶創建了HttpSession對象。此時,JSP容器不再爲用戶創建新的HttpSession對象,而是尋找具有相同會話標識符的HttpSession對象,然後建立該HttpSession對象和當前請求的關聯。

  會話標識符以Cookie的形式在服務器和瀏覽器之間傳送,標準會話屬性在服務器端也是以會話的形式存在的,並且這個Cookie的生命週期只是臨時的,即會話結束後就自動消失,沒有爲它指定固定的生命週期,因此有人說session是基於Cookie的技術。另外,如果客戶端不支持Cookie,運用url重寫機制來保證會話標識符傳回服務器。

  還有一點,session不像Cookie那樣擁有路徑訪問的問題。session對應的是窗口,只要是同一個客戶端或者是存在父子關係的多個客戶端,同一個application下的servlet/JSP可以共享同一個session。當然,session和窗口的對應關係也是受時間限制的,至於多長時間,可以在服務器的conf/web.xml中配置<session-config><session- timeout>30</session-timeout></session-config>

  實例代碼:

  1.設置session 和 顯示session

  Java代碼

  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

  resp.setContentType("text/html");

  PrintWriter out=resp.getWriter();

  //String title="Session Tracking Example";

  HttpSession session=req.getSession(true);//如果沒有該session,則自動創建一個新的

  String heading;

  Integer accessCount=(Integer)session.getAttribute("accessCount");

  if(accessCount==null){

  accessCount=new Integer(0);

  heading="Welcome, NewComer!";

  }else{

  accessCount=new Integer(accessCount.intValue()+1);

  heading="Welcome,back!";

  }

  session.setAttribute("accessCount", accessCount);

  out.println("<html><head><title>Session追蹤</title></head>"

  +"<body bgcolor=\"#FDF5E6\">\n"

  +"<h1 align=\"center\">"

  +heading+"</h1>\n"

  +"<h2>Information On Your Session: </h2>\n"

  +"<table border=1 align=\"center\">\n"

  +"<tr>\n"+" <td>id\n"+"<td>"+session.getId()+"\n"

  +"<tr>\n"+" <td>CreatTime\n"+"<td>"

  +new Date(session.getCreationTime())+"\n"

  +"<tr>\n"+" <td>Time Of Last Access\n"+"<td>"

  +new Date(session.getLastAccessedTime())+"\n"

  +"<tr>\n"+" <td>Number Of Prious Access\n"+"<td>"

  +accessCount+"\n"+"</table>\n"+"</body></html>");

  }

  2.URL重寫

  Java代碼

  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

  resp.setContentType("text/html");

  PrintWriter out=resp.getWriter();

  HttpSession session=req.getSession(true);

  out.println("<html><head><title>Session追蹤</title></head>"

  +"<body>\n"

  +"Session ID: "+session.getId()+"<br>"

  +"from URL? : "+req.isRequestedSessionIdFromURL()+"<br>"

  +"from Cookie? : "+req.isRequestedSessionIdFromCookie()+"<br>"

  +"<a href="+resp.encodeURL(req.getRequestURL().toString())+">test</a& gt;<br>"//重寫URL:encodeURL(),如果瀏覽器的cookie沒有禁掉,則這句話沒有對 req.getRequestURL().toString()作任何處理,還是保持這個字符串的原樣;如果cookie被禁掉了,則在字符串的後面加上一字符串";"+session ID

  +"<a href="+req.getRequestURL().toString()+">test</a>"

  +"</body></html>");

  }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章