重溫Servlet學習筆記--session對象


  session的類型是屬於HttpSession,HttpSession是由javaWeb提供的,用來會話跟蹤的類.session是服務器端對象,保存在服務器端.

  •   HttpSession是servlet三大域對象之一,其他兩個是request和application(servletContext),所以它也有setAttribute(),getAttribute(),等方法.
  •   HttpSession的會話范圍是某用戶從首次訪問服務器開始,到該用戶關閉瀏覽器結束,session對象會存活在這中間的整個過程,  服務器會為每個客戶端創建一個session對象,session就好像是客戶在服務器端的賬戶,他被服務器保存在一個Map里,這個Map被稱為session緩存.
  • session的實現原理

   session底層是依賴Cookie的!我們來理解一下session的原理吧!

    當我首次去銀行時,因為還沒有賬號,所以需要開一個賬號,我獲得的是銀行卡,而銀行這邊的數據庫中留下了我的賬號,我的錢是保存在銀行的賬號中,而我帶走的是我的卡號。當我再次去銀行時,只需要帶上我的卡,而無需再次開一個賬號了。只要帶上我的卡,那么我在銀行操作的一定是我的賬號!

      當首次使用session時,服務器端要創建session,session是保存在服務器端,而給客戶端的session的id(一個cookie中保存了sessionId)。客戶端帶走的是sessionId,而數據是保存在session中。當客戶端再次訪問服務器時,在請求中會帶上sessionId,而服務器會通過sessionId找到對應的session,而無需再創建新的session。

     下面寫一個簡單的案例,加深一下對session和cookie的理解,我們要實現一個簡單的登錄功能,登錄成功時會將用戶名保存到一個session中,同時也保存到一個cookie中,然后會跳轉到成功頁面,但用戶直接輸入url訪問成功頁面時,需要驗證用戶是否已登錄(用session),如果沒有登陸則跳轉回登錄頁面,當瀏覽器關閉再打開訪問登錄頁面時,自動顯示上一次的訪問登錄用戶名(用cookie):

新建一個jsp,命名為login.jsp(head標簽內容已省略):

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  
  <body>
  <%
          String username="";
          Cookie[] cookie=request.getCookies();
          if(cookie!=null){
              for(Cookie c:cookie){
                  if("username".equals(c.getName())){
                      username=c.getValue();
                  }
              }
          }
  %>
  <form  action="<c:url value='/LoginServlet'/>" method="post">  
  <label style="font-color:red;">${errorLogin }</label><br>
   用戶名:<input type="text" name="username" value="<%=username%>"/><br>
   密碼:<input type="password" name="password"/><br>
   <input type="submit" value="登錄"/>
  </form>
  
  </body>
</html>

新建一個servlet,命名為LoginServlet,用來處理登錄邏輯,並完整各個功能(只提供關鍵代碼):

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
    String username=request.getParameter("username");
    String password=request.getParameter("password");
    if(username.equals("wang")&&password.equals("123")){
        HttpSession session = request.getSession();
        session.setAttribute("username", username);
        session.setAttribute("password", password);
        Cookie cookie=new Cookie("username",username);
        cookie.setMaxAge(60*60*24*7);
        response.addCookie(cookie);
        response.sendRedirect("/test/sessionDemo1/succ1.jsp");
    }else{
        request.setAttribute("errorLogin", "用戶名或密碼錯誤");
        request.getRequestDispatcher("/sessionDemo1/login.jsp").forward(request, response);
    }
    }

最后新建一個登陸成功時的jsp頁面,命名為succ1.jsp(只提供body部分代碼):

<body>
    <%
        String username=(String)session.getAttribute("username");
        String password=(String)session.getAttribute("password");
        if(username==null){
            request.setAttribute("errorLogin", "您還沒有登錄,請先登錄");
            request.getRequestDispatcher("/sessionDemo1/login.jsp").forward(request, response);
            return;
        }
            
    %>
    登陸成功,你好${username }
  </body>
  • HttpSession的其他方法:
  1. String getId():獲取sessionId
  2. int getMaxInactiveInterval();獲取session的最大不活動時間,默認為30分鍾,如果session在30分鍾內沒有被使用,Tomcat就會在session池中移除這個session對象
  3. void invalidate();讓session失效,用戶退出登錄時,可以調用該方法
  • web.xml中配置session的最大不活動時間:
      <session-config>
          <session-timeout>20</session-timeout>
      </session-config>

    session最常用的東西就是作為域對象,傳遞參數,也是最重要的,其他的知識點在某些地方也很重要,要好好理解.

 


免責聲明!

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



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