在了解session和cookie技術之前,我們需要先了解一下什么是會話?會話可以簡單理解為用戶打開一個瀏覽器,點擊多個超鏈接,訪問服務器的多個web資源,然后關閉瀏覽器,整個過程稱為一個會話。這樣,在一次會話過程中,用戶在訪問web資源的過程中,各自產生了一些數據,那么用戶如何來保存這些數據呢?舉個簡單例子,假如我們的網站是一個購物的網站,如果用戶點擊了購買的servlet的之后產生了一條購買的商品數據,這個數據應該存到哪里呢?那么當該用戶點擊付款servlet的時候,又從哪里去獲取上次購買之后產生的商品數據呢?對於這個問題的結果,我們有兩種解決方案,那就是基於cookie的客戶端會話保存技術,和基於服務端的會話保存技術。
1.cookie技術
①cookie技術的說明:cookie是客戶端的技術,程序把每個用戶的數據以cookie的形式寫給用戶自己的瀏覽器。當用戶使用瀏覽器再去訪問服務器中的web資源時,就會帶着各自的數據去,這樣web資源處理的就是用戶各自的數據了。
②cookie實現會話數據共享原理圖:
③基於cookie技術實現顯示用戶上一次訪問網站的時間,示例代碼如下所示:
package com.servlet; import java.io.IOException; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 基於session的回顯上次訪問時間的案例 * * @author Administrator * */ @WebServlet("/slad.do") public class ShowLastAccessDateServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 涉及到中文,解決下亂碼問題 response.setCharacterEncoding("UTF-8"); // 告訴瀏覽器以什么方式和編碼打開 response.setContentType("text/html; charset=UTF-8"); // 1.回寫上次的訪問時間 Cookie[] cookies = request.getCookies(); for (int i = 0; cookies != null && i < cookies.length; i++) { if (cookies[i].getName().equals("lastAccessTime")) { Date date = new Date(Long.parseLong(cookies[i].getValue())); response.getWriter().print("您上次的訪問時間是:" + date.toLocaleString()); } } // 2.記錄下這次的訪問時間 Cookie dateCookie = new Cookie("lastAccessTime", System.currentTimeMillis() + ""); // 設置cookie的有效時間,單位為秒,這里設置一個月 dateCookie.setMaxAge(30 * 24 * 3600); // 設置那些url地址訪問有效,這里設置是整個項目訪問都有效 dateCookie.setPath("/JavaWebDemo/"); // 加入到response中 response.addCookie(dateCookie); } }
2.session技術
①session技術的說明:session是服務端的技術,利用這個技術,服務器在運行時可以為每個用戶的瀏覽器創建一個其獨享的session對象,由於session對象為用戶瀏覽器獨享,所以用戶在訪問web資源時,可以把各自的數據放到各自的session中,當用戶再去訪問服務器中的其他的web資源時,其他web資源再從用戶各自的session中取出數據為用戶服務。
②session的實現原理是基於cookie機制的,如下圖所示:
③因為服務器在創建session的時候,寫給瀏覽器的cookie是沒有設置有效期,所以當用戶把瀏覽器關了之后,那么當用戶重新帶開瀏覽器訪問我們的項目的時候,cookie不存在了,所以之前存到session中的數據無法取到了,要保持原來的session有效,不讓數據丟失,我們可以自己手動創建一個和session寫給瀏覽器一摸一樣的cookie只是多了個有效期而已,這樣就能夠解決瀏覽器關閉之后,再次打開瀏覽器,就能訪問到之前存到session中的數據了,示例代碼如下所示:
// 獲取session對象 HttpSession session = request.getSession(); // 重寫cookie返回給瀏覽器 Cookie cookie = new Cookie("JSESSIONID", session.getId()); // 設置有效期,時間為秒 cookie.setMaxAge(30 * 60); // 設置path cookie.setPath("/JavaWebDemo"); // 加入到response對象中 response.addCookie(cookie);
④session實現會話數據共享原理圖:
⑤基於session技術實現顯示用戶上一次訪問網站的時間,示例代碼如下所示:
package com.servlet; import java.io.IOException; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 基於cookie的回顯上次訪問時間的案例 * * @author Administrator * */ @WebServlet("/slat.do") public class ShowLastAccessTimeServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 涉及到中文,解決下亂碼問題 response.setCharacterEncoding("UTF-8"); // 告訴瀏覽器以什么方式和編碼打開 response.setContentType("text/html; charset=UTF-8"); // 1.回寫上次的訪問時間,這里面設置了false,代表當沒有session的時候,不重新創建session HttpSession session = request.getSession(false); if (session != null && session.getAttribute("lastAccessTime") != null) { Date date = new Date(Long.parseLong(session.getAttribute("lastAccessTime").toString())); response.getWriter().print("您上次的訪問時間是:" + date.toLocaleString()); } // 2.記錄下這次的訪問時間 request.getSession().setAttribute("lastAccessTime", System.currentTimeMillis() + ""); } }
至此,一個簡單cookie和session實現會話數據共享說明完畢,有不足的地方,希望大家多多提意見!