您好,登錄后才能下訂單哦!
這篇文章主要介紹了SpringBoot下如何實現(xiàn)session的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇SpringBoot下如何實現(xiàn)session文章都會有所收獲,下面我們一起來看看吧。
無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶功能。缺少狀態(tài)意味著,假如后面的處理需要前面的信息,則前面的信息必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要前面信息時,應(yīng)答就較快。直觀地說,就是每個請求都是獨立的,與前面的請求和后面的請求都是沒有直接聯(lián)系的。
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)用就是這樣的。
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也就消失了
此處主要整理SpringBoot實現(xiàn)session保持的方法講解
Spring Session的實現(xiàn)Session共享,可以很方便的與Spring Secuity集成,增加諸如findSessionsByUserName,rememberMe,限制同一個賬號可以同時在線的Session數(shù)(如設(shè)置成1,即可達(dá)到把前一次登錄頂?shù)舻男Ч┑鹊?/p>
實現(xiàn)方法:SpringSession+redis(可以實現(xiàn)session不同服務(wù)器之間的共享,適合多機部署)
服務(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)頭中。
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è)資訊頻道。
免責(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)容。