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的其他方法:
- String getId():獲取sessionId
- int getMaxInactiveInterval();獲取session的最大不活動時間,默認為30分鍾,如果session在30分鍾內沒有被使用,Tomcat就會在session池中移除這個session對象
- void invalidate();讓session失效,用戶退出登錄時,可以調用該方法
- web.xml中配置session的最大不活動時間:
<session-config> <session-timeout>20</session-timeout> </session-config>
session最常用的東西就是作為域對象,傳遞參數,也是最重要的,其他的知識點在某些地方也很重要,要好好理解.