真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

利用SpringSession和redis對Session進行共享詳解

前言

創(chuàng)新互聯(lián)制作網(wǎng)站網(wǎng)頁找三站合一網(wǎng)站制作公司,專注于網(wǎng)頁設計,成都網(wǎng)站制作、成都網(wǎng)站建設,網(wǎng)站設計,企業(yè)網(wǎng)站搭建,網(wǎng)站開發(fā),建網(wǎng)站業(yè)務,680元做網(wǎng)站,已為近千家服務,創(chuàng)新互聯(lián)網(wǎng)站建設將一如既往的為我們的客戶提供最優(yōu)質的網(wǎng)站建設、網(wǎng)絡營銷推廣服務!

我們在搭建完集群環(huán)境后,不得不考慮的一個問題就是用戶訪問產(chǎn)生的session如何處理。

session的處理有很多種方法,詳情見轉載的上篇博客:集群/分布式環(huán)境下5種session處理策略

在這里我們討論其中的第三種方法:session共享。

redis集群做主從復制,利用redis數(shù)據(jù)庫的最終一致性,將session信息存入redis中。當應用服務器發(fā)現(xiàn)session不在本機內(nèi)存的時候,就去redis數(shù)據(jù)庫中查找,因為redis數(shù)據(jù)庫是獨立于應用服務器的數(shù)據(jù)庫,所以可以做到session的共享和高可用。

不足:

1.redis需要內(nèi)存較大,否則會出現(xiàn)用戶session從Cache中被清除。

2.需要定期的刷新緩存

初步結構如下:

利用Spring Session和redis對Session進行共享詳解

但是這個結構仍然存在問題,redis master是一個重要瓶頸,如果master崩潰的時候,但是redis不會主動的進行master切換,這時session服務中斷。

但是我們先做到這個結構,后面再進行優(yōu)化修改。

Spring Boot提供了Spring Session來完成session共享。

官方文檔:http://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot.html#boot-sample

首先創(chuàng)建簡單的Controller:

@Controller 
public class UserController { 
 
 @RequestMapping(value="/main", method=RequestMethod.GET) 
 public String main(HttpServletRequest request) { 
 HttpSession session = request.getSession(); 
 String sessionId = (String) session.getAttribute("sessionId"); 
 if (null != sessionId) { // sessionId不為空 
 System.out.println("main sessionId:" + sessionId); 
 return "main"; 
 } else { // sessionId為空 
 return "redirect:/login"; 
 } 
 } 
 
 
 @RequestMapping(value="/login", method=RequestMethod.GET) 
 public String login() { 
 return "login"; 
 } 
 
 @RequestMapping(value="/doLogin", method=RequestMethod.POST) 
 public String doLogin(HttpServletRequest request) { 
 System.out.println("I do real login here"); 
 HttpSession session = request.getSession(); 
 String sessionId = UUID.randomUUID().toString(); 
 session.setAttribute("sessionId", sessionId); 
 System.out.println("login sessionId:" + sessionId); 
 return "redirect:/main"; 
 } 
} 

簡單來說就是模擬一下權限控制,如果sessionId存在就訪問主頁,否則就跳轉到登錄頁面。

那么如何實現(xiàn)session共享呢?

加入以下依賴:

 
 
 org.springframework.session 
 spring-session 
 1.3.0.RELEASE 
 
 
 
 org.springframework.boot 
 spring-boot-starter-redis 
 

增加配置類:

@EnableRedisHttpSession 
public class HttpSessionConfig { 
 @Bean 
 public JedisConnectionFactory connectionFactory() { 
 return new JedisConnectionFactory(); 
 } 
} 

這個配置類有什么用呢?

官方文檔:

The Spring configuration is responsible for creating a Servlet Filter that replaces the HttpSession implementation with an implementation backed by Spring Session. 

也就是說,這個配置類可以創(chuàng)建一個過濾器,這個過濾器支持Spring Session代替HttpSession發(fā)揮作用。

The @EnableRedisHttpSession annotation creates a Spring Bean with the name of springSessionRepositoryFilter that implements Filter. The filter is what is in charge of replacing the HttpSession implementation to be backed by Spring Session. In this instance Spring Session is backed by Redis.

@EnableRedisHttpSession注解會創(chuàng)建一個springSessionRepositoryFilter的bean對象去實現(xiàn)這個過濾器。過濾器負責代替HttpSession。

也就是說,HttpSession不再發(fā)揮作用,而是通過過濾器使用redis直接操作Session。

在application.properties中添加redis的配置:

spring.redis.host=localhost 
spring.redis.password= 
spring.redis.port=6379 

這樣,就完成了Session共享了。是不是很簡單?業(yè)務代碼甚至不需要一點點的修改。

驗證:

利用Spring Session和redis對Session進行共享詳解

一開始redis數(shù)據(jù)庫是空的。

運行項目:

利用Spring Session和redis對Session進行共享詳解

訪問頁面之后,可以在redis中看到session的信息。

隨便登陸之后:

利用Spring Session和redis對Session進行共享詳解

進入到了main中。說明當前這個session中是存在sessionId的。

我們查看當前頁面的cookie。也就是說,這個cookie是存在sessionId的。

利用Spring Session和redis對Session進行共享詳解

再運行一個新的項目,端口為8081。在原本的瀏覽器中直接打開一個新的標簽頁,我們知道,這個時候cookie是共享的。訪問localhost:8081/main

利用Spring Session和redis對Session進行共享詳解

我們直接訪問新的項目成功了??!同一個cookie,可以做到session在不同web服務器中的共享。

最后再次強調:

HttpSession的實現(xiàn)被Spring Session替換,操作HttpSession等同于操作redis中的數(shù)據(jù)。

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯(lián)的支持。


網(wǎng)站題目:利用SpringSession和redis對Session進行共享詳解
分享地址:http://weahome.cn/article/pjpjch.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部