JavaWeb基於session和cookie的數據共享


         在了解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實現會話數據共享說明完畢,有不足的地方,希望大家多多提意見!


免責聲明!

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



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