1. 程式人生 > 實用技巧 >第三天

第三天

三、Session

1、介紹

  • Http是無狀態的協議,也就是它不儲存連線的資訊,但很多時候,我們需要儲存一個HTTP連線的某些資訊,這就誕生了一些儲存機制。

  • 說到儲存,第一個想到的是將資訊儲存到伺服器中,這就是Session,因為使用者應該是知道一個HTTP請求的相關引數的,但伺服器在這條連線斷開後就丟失了這些資訊。

  • Session的問題在於每臺伺服器都需要儲存所有的session,當訪問量很大時,這是一筆很大的開銷,而且讓伺服器變得難以維護。將所有的session儲存到一臺伺服器進行集中式的管理可以減小開銷,但無法解決單點故障的問題。採用分散式的方式,可以解決這兩個問題,但又會增加資料查詢的成本。

  • 換個思路,讓客戶端來儲存連線的資訊,伺服器不儲存。但是這樣的話,會有很大的安全性問題,Session資訊是明文的,壞人可以通過偽造Session資訊來欺騙伺服器,因此,伺服器需要有能力來分辨合法和非法的session資訊,這就是Token。

  • Token,由Session和簽名組成,簽名通過金鑰和特定的演算法得出。當用戶通過Token訪問伺服器時,伺服器只需要通過金鑰和演算法再次計算Session的簽名並和token攜帶的金鑰進行比對即可,若相同,Session合法,反之,不合法。

2、小程式碼片段

    @RequestMapping("/login")
    public String login(String username, String password, HttpSession session){
        int id = 1;
        User user = userService.login(new User(id, username, password));

        if(user != null){

            // if login successfully, add user into session
            session.setAttribute("user", user);
            return "success";
        }
        else{
            return "failer";
        }
    }