溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringBoot下如何實現(xiàn)session

發(fā)布時間:2022-03-17 13:32:12 來源:億速云 閱讀:541 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了SpringBoot下如何實現(xiàn)session的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇SpringBoot下如何實現(xiàn)session文章都會有所收獲,下面我們一起來看看吧。

    相關(guān)概念

    1.HTTP是無狀態(tài)協(xié)議

    無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶功能。缺少狀態(tài)意味著,假如后面的處理需要前面的信息,則前面的信息必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要前面信息時,應(yīng)答就較快。直觀地說,就是每個請求都是獨立的,與前面的請求和后面的請求都是沒有直接聯(lián)系的。

    2.哪些方法可以實現(xiàn)有狀態(tài)連接

    • cookies

    • session

    • application

    例如:

    但是,商店為了提高收益。她是想鼓勵顧客購買的。所以告訴你,只要你在一個月內(nèi)購買了5瓶以上的啤酒,就送你一個酒杯。

    我們看看這種情況我們怎么去實現(xiàn)呢?

    A:給顧客發(fā)放一個磁卡,里面放有顧客過去的購買信息。

    這樣商店就可以知道了。這就是cookie.

    B:給顧客發(fā)放一個唯一號碼,號碼制定的顧客的消費信息,存儲在商店的服務(wù)器中。這就是session。

    最后,商店可以全局的決定,是5瓶為送酒杯還是6瓶。這就是application。

    其實,這些機制都是在無狀態(tài)的傳統(tǒng)購買過程中加入了一點東西,使整個過程變得有狀態(tài)。Web應(yīng)用就是這樣的。

    3.Session是由Web服務(wù)器端(Tomcat)維護(hù)的

    Session是由Web容器管理的,即一個session只保存在一臺機器上,適合于單體應(yīng)用;

    但是隨著架構(gòu)的演練,不斷的向微服務(wù)分布式集群演進(jìn),傳統(tǒng)的Session就不能工作了,為了解決所有服務(wù)器共享一套Session,Session需要保存在一個公共的會話倉庫(Session Repository)中,所有服務(wù)器都訪問同一個倉庫,這樣所有服務(wù)器的狀態(tài)都一致了。

    • Spring Session支持的倉庫有Reids、MongoDB、JDBC

    • Cookie是由客戶端(瀏覽器)維護(hù)的

    • Session對應(yīng)著一個瀏覽器窗口,當(dāng)瀏覽器關(guān)閉了該Session也就消失了

    實現(xiàn)方法

    此處主要整理SpringBoot實現(xiàn)session保持的方法講解

    Spring Session的實現(xiàn)Session共享,可以很方便的與Spring Secuity集成,增加諸如findSessionsByUserName,rememberMe,限制同一個賬號可以同時在線的Session數(shù)(如設(shè)置成1,即可達(dá)到把前一次登錄頂?shù)舻男Ч┑鹊?/p>

    實現(xiàn)方法

    實現(xiàn)方法:SpringSession+redis(可以實現(xiàn)session不同服務(wù)器之間的共享,適合多機部署)

    實現(xiàn)原理

    服務(wù)端首先查找對應(yīng)的cookie的值(sessionid)。

    根據(jù)sessionid,從服務(wù)器端session存儲中獲取對應(yīng)id的session數(shù)據(jù),進(jìn)行返回。

    如果找不到sessionid,服務(wù)器端就創(chuàng)建session,生成sessionid對應(yīng)的cookie,寫入到響應(yīng)頭中。

    實現(xiàn)代碼

    如何插入一段漂亮的代碼片

    POM依賴

    // 相關(guān)依賴        <dependency>            <groupId>redis.clients</groupId>            <artifactId>jedis</artifactId>        </dependency>                <dependency>            <groupId>org.springframework.session</groupId>            <artifactId>spring-session-core</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-redis</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.session</groupId>            <artifactId>spring-session-data-redis</artifactId>        </dependency>

    application.yml

    // 配置redis  spring:  redis:    host: localhost    port: 6379    database: 0    jedis:      pool:        max-active: 100        max-wait: 10        max-idle: 10        min-idle: 10

    RedisHttpSessionConfiguration.java

      /** * 開啟Redis Http Session */@Configuration@EnableRedisHttpSessionpublic class RedisHttpSessionConfiguration {}

    SessionController.java

    @RestControllerpublic class SessionController {    @RequestMapping("/session")    public Object springSession(@RequestParam("username") String username, HttpServletRequest request, HttpSession session) {        Cookie[] cookies = request.getCookies();        if (cookies != null && cookies.length > 0) {            for (Cookie cookie : cookies) {                if (cookie.getName().contains("JSESSION")) {                    System.out.println(cookie.getName() + "=" + cookie.getValue());                }            }        }        Object value = session.getAttribute("username");        if (value == null) {            System.out.println("用戶不存在");            session.setAttribute("username", "{username: '" + username+ "', age: 28}");        } else {            System.out.println("用戶存在");        }        return "username=" + value;    }}

    訪問8080端口,查看

    關(guān)于“SpringBoot下如何實現(xiàn)session”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“SpringBoot下如何實現(xiàn)session”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI