一.session共享的應用場景
每個客戶端與服務器交互時生成會話的sessionID是唯一,同個客戶端在訪問不同的域名:主域名、子域名、跨站點域名或跨服務器域名,會有不同的sessionID,有些應用程序會在session存放用戶的狀態和信息,同個應用程序的客戶端需訪問不同的服務端項目,爲了使用戶在登入後能夠在規定時間內保持登入狀態,需要進行session共享,多個的項目之間可以使用同個session;
簡而言之:不同的服務器之間使用同個用戶的session數據
二.Java中的session存儲
session的創建:
服務端程序調用HttpServletRequest的getSession()時,創建java對象session,,服務器會爲該Session生成唯一的Session id;通過對象的相關api可以存放數據,響應客戶端(攜帶sessionId),客戶端再次請求時會攜帶id,服務器接受到請求之後就會依據Session id找到相應的Session;
session的存放:
在服務端session存放在內存中,客戶端的Cookie保存sessionID;
session的銷燬:
1)超時 2)程序調用HttpSession.invalidate() 3)程序關閉;
三.實現
1.添加依賴
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
2.spring的redis 配置
<bean
id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="maxInactiveIntervalInSeconds" value="1800" />
</bean>
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="50" />
<property name="maxTotal" value="100" />
</bean>
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
<property name="hostName" value="127.0.0.1" />
<property name="port" value="6379" />
<property name="timeout" value="3000" />
<property name="usePool" value="true" />
<property name="poolConfig" ref="jedisPoolConfig" />
</bean>
3.web.xml配置
<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>
</filter-mapping>
4.以上配置後已經可以進行session共享了,java程序中在用戶登入後可以將用戶信息存放在session中,這時redis也就存儲了session相關的內容;
demo
程序中:
request.getSession().setAttribute("member", member);//會員信息;
redis: