天天看點

javaWeb之Cookie和SessionCookie的基本使用Session小結

會話:使用者打開浏覽器,通路web伺服器的資源,會話建立,直接有一方斷開連接配接,會話結束,在一次會話中可以包含多次請求和響應

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

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

實作方式:

1、用戶端會話跟蹤技術:Cookie

2、伺服器會話跟蹤技術:Session

Cookie的基本使用

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

發送Cookie

1、建立Cookie對象,設定資料

Cookie cookie=new Cookie("key","value");
           

2、發送Cooker到用戶端:使用response對象

response.addCookie(cookie);
           
package top.wogong.web.Cookie;

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 java.io.IOException;

@WebServlet("/cookie2")
public class CookieDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //向用戶端發送Cookie
        //1、建立Cookie
        Cookie cookie=new Cookie("username","zhangsan");
        
        //設定Cookie存活時間
        cookie.setMaxAge(60*60*24*7);
        
        //2、發送Cookie
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}
           

擷取Cookie

3、擷取用戶端攜帶的所有Cookie,使用request對象

Cookie[] cookies=request.getCookies();
           

4、變量數組,擷取每個Cookie對象:for

5、使用Cookie對象方法擷取資料

cookie.getName();
cookie.getValue();
           
package top.wogong.web.Cookie;

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 java.io.IOException;

@WebServlet("/getcookie")
public class CookieDemo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //擷取cookie

        //1、擷取cookie數組
        Cookie[] cookies =req.getCookies();

        //2、周遊cookie數組
        for(Cookie cookie:cookies){
            String name=cookie.getName();
            if(name.equals("username")){
                String value = cookie.getValue();
                System.out.println(value);
                break;
            }
        }
    }
}
           

cookie原理

Cookie的實作是基于HTTP協定

響應頭:set-cookie

請求頭:cookie

cookie使用細節

Cookie存活時間

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

設定Cookie的存活時間

setMaxAge(int seconds);
//1、正數;将Cookie寫入浏覽器所在的電腦的硬碟,持久化存儲,到時間自動删除
//2、負數:預設值,Cookie在目前浏覽器記憶體中,當浏覽器關閉,則Cookie被銷毀
//3、零:删除對應Cookie
           

Cookie存儲中文

Cookie預設情況下不能存儲中文

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

Session

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

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

使用:

1、擷取Session對象

HttpSession session =request.getSession();
           

2、Sesion對象功能

存儲資料到session域中

void setAttribute(String name,Object o);
           

根據key,擷取值

Object getAttribute(String name);
           

根據key,删除該鍵值對

void removeAttribute(String name);
           

Session原理

Session是基于Cookie實作的

Session使用細節

Session鈍化、活化

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

鈍化:在伺服器正常關閉後,Tomcat會自動将Session資料寫入硬碟檔案中

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

Session銷毀

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

在session設定自動銷毀時間

<session>
    <sessionitimeout>30</session-timeout>
</session>
           

調用Session對象的invalidate()方法銷毀Session

小結

Cookie和Session都是來完成一次會話内多次請求間資料共享

差別:

存儲位置:Cookie是将資料存儲在用戶端,Session将資料存儲在伺服器

安全性:Cookie不安全,Session安全

資料大小:Cookie最大3KB,Session無大小限制

存儲時間:Cookie可以長期存儲,Session預設存儲30分鐘

伺服器性能:Cookie不占用伺服器,Session占用伺服器資源

繼續閱讀