天天看點

Javaweb會話跟蹤技術(Cookie和Session)一、會話跟蹤技術概述二、Cookie三、Session四Cookie和Sesion差別

目錄

一、會話跟蹤技術概述

二、Cookie

1.Cookie基本原理

2.Cookie基本使用

3.Cookie存活時間

4.cookie存儲中文

三、Session

1.Session鈍化、活化

2.Session基本使用

3.sesion銷毀 

四Cookie和Sesion差別

一、會話跟蹤技術概述

1.會話:使用者打開浏覽器,通路網頁資源,會話就建立了。直到有一方斷開連接配接,會話結束。在一次會話中可以包含多次請求和響應。

2.會話跟蹤:一種維護浏覽器狀态的方法,伺服器需要多次識别請求是否來自同一個浏覽器,以便在同一次會話中的多次請求共享資料。

3.為什麼要共享資料?

答:因為HTTP協定是無狀态的,每次浏覽器向伺服器請求時,伺服器都會将該請求視為新的請求,是以我們需要會話跟蹤技術來實作會話内資料共享。

4.實作方式

用戶端會話跟蹤技術:Cookie

服務端會話跟蹤技術:Session

二、Cookie

1.Cookie基本原理

 cookie的實作是基于HTTP協定的

發送cookie到浏覽器:響應頭:set-cookie

攜帶cookie通路伺服器:請求頭:cookie

2.Cookie基本使用

Cookie:用戶端會話技術,将技術儲存到用戶端,以後每次請求都攜帶Cookie資料進行通路

ps:我們主要是做服務端的開發,那麼使用這個Cookie。首先就是要把這個Cookie發送到客戶浏覽器,以後客戶浏覽器就可以擷取這個Cookie去進行通路其他的Servlet。

(1)發送cookie

使用response對象 

package com.project.JavaScript;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

import java.io.IOException;


@WebServlet("/res")
public class res extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //發送Cookie
        //1.建立Cookie對象
        Cookie cookie = new Cookie("username","666");

        //2.發送Cookie,response
        response.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
           

 檢視方法:F12或者檢測--應用程式--檢視cookie就可以看到了(這是edge浏覽器)

Javaweb會話跟蹤技術(Cookie和Session)一、會話跟蹤技術概述二、Cookie三、Session四Cookie和Sesion差別

(2)擷取cookie

 使用request對象

package com.project.JavaScript;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

import java.io.IOException;


@WebServlet("/res")
public class res extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //擷取Cookie
        //1.擷取Cookie數組
        Cookie[] cookies = request.getCookies();

        //2.周遊數組
        for (Cookie cookie : cookies) {
            //擷取鍵
            String name = cookie.getName();
            //擷取值,要先判斷一下需要的值擷取出來就好了
            if ("username".equals(name)){
                //擷取對應的值
                String value = cookie.getValue();
                //列印
                System.out.println(name+":"+value);
                //擷取到了對應的值就終止
                break;
            }
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
           

運作結果:控制台輸出

username:666

3.Cookie存活時間

 預設情況下,cookie存儲在浏覽器記憶體中,當浏覽器關閉,記憶體釋放,則cookie被銷毀

setMaxAge(int seconds):設定cookie存活時間

1.正數:将cookie寫入浏覽器所在的電腦硬碟,持久化存儲,到時間自動删除

2.負數:預設值,cookie随着浏覽器的關閉而銷毀

3.零:删除對應的cookie

存儲七天的例子

package com.project.JavaScript;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

import java.io.IOException;


@WebServlet("/res")
public class res extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //發送Cookie
        //1.建立Cookie對象
        Cookie cookie = new Cookie("username","666");

        //設定cookie存活7天 60是秒
        cookie.setMaxAge(60*60*27*7);

        //2.發送Cookie,response
        response.addCookie(cookie);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
           

其實就一行代碼

cookie.setMaxAge(60*60*27*7);
           

4.cookie存儲中文

cookie不能直接存儲中文

如果需要存儲,則要進行轉碼:URL編碼 

三、Session

session是基于cookie的 

服務端會話跟蹤技術:将資料儲存到服務端

JavaEE提供HttpSession接口,來實作一次會話的多次請求間資料共享功能

如果資料存儲在cookie裡面,每次通路帶來帶去,就會造成洩露的隐患,是以使用Sessoin比較好一點

1.Session鈍化、活化

伺服器在重新開機後,sesion中的資料是否還存在

鈍化:在伺服器正常關閉後,Tomacat會自動将sesion資料寫入到硬碟中

活化:再次啟動伺服器後,從檔案中加載資料到sesion中

2.Session基本使用

存儲Session 

package com.project.JavaScript;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/Session1")
public class Session1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //存儲到session中
        //1.擷取session對象
        HttpSession session = request.getSession();
        //2.存儲資料
        session.setAttribute("username","KPL");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
           

 擷取Session

package com.project.JavaScript;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/Session2")
public class Session2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //擷取資料,從session中
        //1.擷取session對象
        HttpSession session = request.getSession();

        //2.擷取資料
        Object username = session.getAttribute("username");
        System.out.println(username);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
           

運作結果為

KPL

3.sesion銷毀 

預設情況下,無操作,30分鐘自動銷毀

更改為100分鐘例子

在web.xml裡面配置就好了

<session-config>
        <session-timeout>100</session-timeout>
    </session-config>
           

 立即銷毀(銷毀sesion自己)

session.invalidate();
           

四Cookie和Sesion差別

差別:

存儲位置:cookie是将資料存儲在用戶端,sesion将資料存儲在服務端

安全性:cookie不安全,sesion安全

資料大小:cookie最大3KB,sesion無大小限制

存儲時間:cookie可以長時間存儲,sesion預設30分鐘

伺服器性能:cookie不占用伺服器資源,sesion占用伺服器資源

繼續閱讀