一個維護了幾百年的單體老項目,忽然就火起來了,訪問人數忽然暴增,服務器資源告急,擔憂一下駕崩,老闆一個電話過來跟你說:「!4@!#!!¥@!¥1¥@!」,而後你得大半夜從睡夢中醒來屁顛屁顛的整服務器。前端
下班了,準備發完版本就回去。等等,老闆還在演示,又不能中斷服務器去部署應用。一不當心,一個鐘過去了,還沒結束,你得等啊等啊,終於能夠發佈了。而後你利索的./shutdown下去,代碼啪啦啪啦的上傳完,準備啓動了,盯着啓動日誌,天哪,怎麼log卡住不動了。而後客服機立馬就有人來找你麻煩了。java
更多場景值,此處省略好多 ...nginx
Spring Session提供了一個管理用戶會話信息的API和實現。它還提供透明的整合:git
白話:spring session抽象了一套API,並基於這套API對servlet容器提供的session進行無侵入集成,好比使用redis進行session管理,實現所謂的分佈式session。web
以Maven作爲依賴管理,基於redis的Spring Session實現redis
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>1.0.2.RELEASE</version> <type>pom</type> </dependency>
Spring session對主流的Servlet容器如Tomcat提供透明的整合HttpSession。這意味着開發人員使用HttpSession可藉助Spring Session支持的實現切換實現。spring
Redis有多種客戶端實現,經常使用的有Jedis和Lettuce。具體差異讀者可另行翻閱其餘資料。本文以Jedis爲例。瀏覽器
基於java配置緩存
Sring Java配置tomcat
@EnableRedisHttpSession public class Config{ @Bean public LettuceConnectionFactory connectionFactory() { return new JedisConnectionFactory(); } }
說明:默認的JedisConnectionFactory()
構造方法是連接localhost:6379無密碼的redis-server,實際生產環境可按需選擇合適的構造方法。
Java Servlet容器初始化
Spring配置建立了一個名爲springSessionRepositoryFilter
實現的Spring Bean Filter。該springSessionRepositoryFilterbean
負責HttpSession用Spring Session支持的自定義實現來替換它。
爲了讓咱們Filter發揮它的魔力,Spring須要加載Config.java。最後,咱們須要確保咱們的Servlet容器(即Tomcat)使用咱們springSessionRepositoryFilter
的每一個請求。
幸運的是,Spring Session提供了一個AbstractHttpSessionApplicationInitializer
,繼承它,把配置傳入進去便可,代碼以下:
public class Initializer extends AbstractHttpSessionApplicationInitializer { publicInitializer() { super(Config.class); } }
基於xml配置
bean 配置
<context:annotation-config /> <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" /> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.password}" />
基於xml的配置也至關簡單,這裏注意一下p命名空間,添加引用xmlns:p="http://www.springframework.org/schema/p"
web.xml 配置 filter
<filter> <filter-name>springSessionRepositoryFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSessionRepositoryFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping>
到此爲止,應用已經集成了Spring Session,感受不要太爽了!
注意看中間的紅色部分,沒有了原來的jessionid
,可是新增了 session
。這是實現分佈式session的關鍵。
這裏不是本文重點,就不展開細說了,因爲上面已經解決了應用服務器session共享的問題,因此集羣實現也是很是的簡便,經過nginx反向代理到2個部署到應用的tomcat便可。
ifast是一款基於Spring Boot + Mybatis + Mybatis Plus搭建的快速開發平臺。ifast集成了代碼生成器,具備高效的開發效率。以Spring Boot爲基礎框架,Mybatis plus爲數據訪問層, Apache Shiro爲權限受權層,Ehcahe對經常使用數據進行緩存,基於Bootstrap構建的hplus做爲前端框架。
訪問請點擊 Java快速開發腳手架 ifast