天天看點

Java會話技術之 —— cookie與session

前言

說到cookie與session,想必大家都不陌生,寫過單機模式下的登入業務邏輯的應該多少都會接觸到cookie與session,對于cookie和session,很多同學第一反應就是cookie是存儲再用戶端浏覽器的,而session是放在服務端的

對于網上一大堆的關于對比cookie與session技術的,對于面試來講,臨時突擊加以記憶還是可以的,但說到具體的使用以及原理,還是有必要對其做一些深入的了解和探讨

首先我們通過一個具體的小案例來看看cookie與session的由來

業務場景

假如在單機模式下,系統需要先進行登入,然後才能通路其他的資源(接口)

1、環境準備

快速搭建一個springboot工程,提供兩個接口,登入接口和擷取使用者資訊接口

@RestController
public class LoginController {

    @GetMapping("/login")
    public String login(HttpSession session,HttpServletRequest request,HttpServletResponse response,
                        String username, String password) {
        if(username.equals("admin") && password.equals("123456")){
            session.setAttribute("login_info",username);
            return "login success:" + username;
        }
        return "login fail:" + username;
    }

    @GetMapping("/info")
    public String getLoginInfo(HttpSession session,HttpServletRequest request,HttpServletResponse response) {
        return "info:" + session.getAttribute("login_info");
    }

}
           

首先調第一個登入接口:http://localhost:8081/login?username=admin&password=123456

Java會話技術之 —— cookie與session

接着調第二個擷取使用者資訊接口:

Java會話技術之 —— cookie與session

在此,我們注意到,通過F12觀察到cookie那一欄中,在登陸成功後會産生一個 :jsessionid = B8F3038B28A83185F50BEB116CB97805

而session與cookie的由來就要從這裡說起

2、cookie與session産生的背景

Java會話技術之 —— cookie與session

上圖是一個非常簡單的用戶端通過浏覽器通路服務端的示意圖,由于浏覽器發起請求是無狀态的,即請求不會直接儲存用戶端的會話資訊,但是服務端為了安全考慮以及記錄用戶端請求的會話資訊,于是需要一種中間媒體,可了解為緩存空間,于是各自儲存一下本次的會話資訊,而對于雙方來說,隻需要一個憑證用于辨別對方的身份,這個辨別就是上面的JSESSIONID

對于用戶端來說,儲存的位置就是浏覽器中看到的cookie,而服務端來說,就是session,那麼對于上面的兩個接口可以拆成下面兩步:

  1. 使用者登入成功後,服務端儲存JESSIONID至session,同時浏覽器将JESSIONID儲存至cookie,這一步通過浏覽器的接口請求的header資訊也可以看到,可了解為,用戶端登入時順便攜帶了這個JESSIONID作為憑證告知服務端,這個就是雙方确認身份的憑證
Java會話技術之 —— cookie與session

2、再次調用擷取使用者資訊接口時,用戶端在請求頭中攜帶上面的JSESSIONID,服務端從session中解析這個JSESSIONID的值,解析到了,就從session中取出來,這裡不管是通過斷點還是浏覽器的請求header都可以反映出這個資訊

Java會話技術之 —— cookie與session
Java會話技術之 —— cookie與session

3、清掉cookie,再次發起調用使用者資訊接口時,這一次 /info接口攜帶新的cookie,服務端拿到這個值去session中找并不存在,是以傳回了null

Java會話技術之 —— cookie與session

4、更換浏覽器,在調用了登入接口之後,通過另一個浏覽器通路,無法擷取到使用者的資訊,這說明cookie具有禁止跨域的操作

Java會話技術之 —— cookie與session

5、重新啟動後端服務,在浏覽器沒有做變更的狀态下,再次通路擷取使用者資訊接口,發現未能擷取到使用者的資訊,說明服務端儲存session資訊是存在于tomcat的程序中

Java會話技術之 —— cookie與session

6、使用上述相同的工程再啟動一個相同的服務,以端口區分,然後8081端口依次通路登入,擷取使用者資訊,8082擷取使用者資訊(同一個浏覽器)

Java會話技術之 —— cookie與session
Java會話技術之 —— cookie與session

很明顯,8081和8082是兩個服務對應着不同的程序,8082拿着8081的JSESSIONID去請求第二個服務的使用者資訊肯定是請求不到結果的

從第六步的示範,我們開始思考一個問題,同一個服務部署多份的情況下(叢集部署),如何才能擷取到任一台服務上的資源呢?于是就産生了分布式會話技術

最後再簡單總結下Cookie(Session)的技術點

  1. Cookie屬于用戶端(浏覽器)技術,session屬于服務端(tomcat)技術
  2. 各自記錄JSSESIONID的值,作為雙方互認的憑證,可用于登入校驗中(通過header頭中攜帶cookie的資訊,服務端解析Cookie進行前置校驗)
  3. Cookie具有不可跨域性
  4. 服務端的session資訊的生命周期随着容器的銷毀而銷毀
  5. Cookie可以在浏覽器進行修改、删除
  6. Cookie可以設定有效期(過期時間)

本篇通過案例示範說明了cookie與session的使用和原理,由于從cookie的原理衍生出了衆多的分布式會話解決方案,但是其核心原理都是從這裡出發,希望能夠深入了解,本篇到此結束,最後感謝觀看!

繼續閱讀