javascript
使用spring-session外部化Spring-boot应用程序的会话状态
Spring-session是一個非??岬男马椖?#xff0c;旨在提供一種更簡單的方法來管理基于Java的Web應用程序中的會話。 我最近在spring-session中探索的功能之一是它支持外部化會話狀態的方式,而無需費心諸如Tomcat或Jetty之類的特定Web容器的內部。
為了測試spring-session,我使用了購物車類型的應用程序(可在此處獲得 ),該應用程序通過將添加到購物車中的項保留為session屬性來大量使用session,如以下屏幕截圖所示:
首先考慮沒有Spring會話的場景。 所以這就是我公開我的應用程序的方式:
我正在使用nginx在該應用程序的兩個實例之間實現負載平衡。 使用Spring boot可以很容易地運行此設置,我通過兩個不同的服務器端口啟動了該應用程序的兩個實例:
mvn spring-boot:run -Dserver.port=8080 mvn spring-boot:run -Dserver.port=8082這是我的nginx.conf,可以在這兩個實例之間實現負載平衡:
events {worker_connections 1024; } http {upstream sessionApp {server localhost:8080;server localhost:8082;}server {listen 80;location / {proxy_pass http://sessionApp;} } }我在頁腳中顯示應用程序的端口號只是為了顯示哪個實例正在處理請求。
如果我不采取任何措施將會話狀態移出應用程序,則該應用程序的行為將不穩定,因為在另一個實例上無法識別在該應用程序的一個實例上建立的會話-特別是如果Tomcat接收到一個會話id,它無法識別,則行為是創建一個新會話。
將Spring會話引入應用程序
有一些特定于容器的方法來引入外部會話存儲– 這里是一個示例,其中Redis被配置為Tomcat的存儲。 Pivotal Gemfire提供了一個模塊來外部化Tomcat的會話狀態 。
使用Spring-session的好處是根本不依賴容器-保持會話狀態成為應用程序的考慮因素。 在Spring會話站點上,關于配置應用程序以使用Spring會話的說明非常詳細,只是為了快速總結一下我如何配置Spring Boot應用程序,這些首先是我引入的依賴項:
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session</artifactId><version>1.0.0.BUILD-SNAPSHOT</version> </dependency> <dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId><version>1.0.0.BUILD-SNAPSHOT</version> </dependency> <dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.4.1.RELEASE</version> </dependency> <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.4.1</version> </dependency>以及將Spring-session用于會話支持的配置,請注意特定于Spring Boot的FilterRegistrationBean,用于注冊會話存儲庫過濾器 :
mport org.springframework.boot.context.embedded.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; import org.springframework.session.web.http.SessionRepositoryFilter; import org.springframework.web.filter.DelegatingFilterProxy;import java.util.Arrays;@Configuration @EnableRedisHttpSession public class SessionRepositoryConfig {@Bean@Order(value = 0)public FilterRegistrationBean sessionRepositoryFilterRegistration(SessionRepositoryFilter springSessionRepositoryFilter) {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();filterRegistrationBean.setFilter(new DelegatingFilterProxy(springSessionRepositoryFilter));filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));return filterRegistrationBean;}@Beanpublic JedisConnectionFactory connectionFactory() {return new JedisConnectionFactory();} }就是這樣! 現在神奇的是,所有會話都由Spring會話處理,并巧妙地外部化到Redis。
如果我要重試以前的使用nginx使用公共Redis存儲對兩個不同的Spring-Boot應用程序進行負載平衡的配置,則該應用程序將正常運行,而不管實例處理請求的情況如何。 我期待進一步完善這個出色的新項目。
- 使用Spring會話的示例應用程序可在此處獲得 :https://github.com/bijukunjummen/shopping-cart-cf-app.git
翻譯自: https://www.javacodegeeks.com/2014/11/externalizing-session-state-for-a-spring-boot-application-using-spring-session.html
總結
以上是生活随笔為你收集整理的使用spring-session外部化Spring-boot应用程序的会话状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玩家反馈《星空》游戏存在崩溃问题,B 社
- 下一篇: 使用纯HTML和OmniFaces构建动