JavaWeb學習——session總結


一、session簡介

sesion也就是會話,Session對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的Web頁之間跳轉時,存儲在Session對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程序的 Web頁時,如果該用戶還沒有會話,則Web服務器將自動創建一個 Session對象。當會話過期或被放棄后,服務器將終止該會話。Session 對象最常見的一個用法就是存儲用戶的首選項。

需要注意:一個瀏覽器獨占一個session對象(默認情況下),且會話狀態僅在支持cookie的瀏覽器中保留。當瀏覽器關閉后,代表本次會話結束。一次會話是瀏覽器與服務器通訊開始至瀏覽器關閉。

二、Session和Cookie的區別

  • Cookie是把用戶的數據寫給用戶的瀏覽器。
  • Session技術把用戶的數據寫到用戶獨占的session中。
  • Session對象由服務器創建,存放的是對象(Object);而cookie是以鍵值對的形式存放數據。

三、session實現原理

第一次請求時,會響應一個cookie,名稱是jsessionid,值是一串32位組成標識符。當閉關本次會話時,開始下次會話,那么32位標識符會發生改變,即認為不是同一次會話,session對象默認是30分鍾后銷毀。代碼如下:

 1 package com.session.controller;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 import javax.servlet.http.HttpSession;
10 
11 public class sessionController extends HttpServlet{
12     @Override
13     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
14         req.setCharacterEncoding("utf-8");
15         resp.setContentType("text/html;charset=utf-8");
16         
17         //使用request對象的getSession()獲取session,如果session不存在則創建一個
18         HttpSession session = req.getSession();
19         //將數據存儲到session中
20         session.setAttribute("data", "00000");
21         //獲取session的id
22         String sessionId = session.getId();
23         //判斷session是不是新創建的
24         if (session.isNew()) {
25             resp.getWriter().print("sesion創建成功,session的id="+ sessionId);
26         }else {
27             resp.getWriter().print("session已存在!id是"+ sessionId);
28         }        
29     }
30

第一次訪問創建一個新的session

不關閉瀏覽器再訪問

發現還是同一個session

 可猜想request.getSession()方法內部新創建了Session之后一定是做了如下的處理

復制代碼
1 //獲取session的Id
2 String sessionId = session.getId();
3 //將session的Id存儲到名字為JSESSIONID的cookie中
4 Cookie cookie = new Cookie("JSESSIONID", sessionId);
5 //設置cookie的有效路徑
6 cookie.setPath(request.getContextPath());
7 response.addCookie(cookie);
復制代碼

五、session對象的銷毀

session對象默認30分鍾沒有使用,則服務器會自動銷毀session

5.1 在web.xml文件中可以手工配置session的失效時間,例如:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>webdemo</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
     <servlet-name>sessionController</servlet-name>
     <servlet-class>com.session.controller.sessionController</servlet-class>
  </servlet>
  <servlet-mapping>
     <servlet-name>sessionController</servlet-name>
     <url-pattern>/session</url-pattern>
  </servlet-mapping>

  <!-- 設置Session的有效時間:以分鍾為單位-->
    <session-config>
        <session-timeout>15</session-timeout>
    </session-config>

</web-app>

5.2 在程序中手動設置Session失效時間

可以在創建session之后,調用session.getMaxInactiveInterval();方法,設置session生效時間。

參數以秒為單位,例如,一天就是session.getMaxInactiveInterval(1*60*60*24);

六、常用api

  • getSession()      創建session對象,用requst對象調用,參數:true:自動創建,false:不創建

  • session.getId()  獲取session的id
  • session.setMaxInactiveInterval(1*60*60)  設置session自動銷毀時間,以秒為單位,這里是1小時

  • session.setAttribute("session", "12345678");   往session域存儲數據,object類型

  • session.getAttribute("session");  取數據,取出是object類型
  • session.removeAttribute(“session”);  刪除session域中指定的數據

還可以在request域或servletContext域中存取刪session,函數名都一樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM