<dependency>
<groupId>org.springframework.sessiongroupId>
<artifactId>spring-sessionartifactId>
<version>1.1.0.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.datagroupId>
<artifactId>spring-data-redisartifactId>
<version>1.6.4.RELEASEversion>
dependency>
<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
<version>2.8.0version>
dependency>
非maven自行下载,需要注意多下一个commons-pool2-2.3.jar
maven不必下载,maven已经自动解决依赖了
我的机器是windows,所以下载的是windows版本的.Redis官方只支持linux,这里用的是MS Open Tech开发的windows版本,地址在这redis for windows,记得下载zip版本,最新版本3.0.501,往下滑就能看到
注意这个start.bat是我自己建的,内容如下:
redis-server redis.windows.conf
点击start.bat就能启动redis,具体配置不说了,自行google
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"/>
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="127.0.0.1" />
<property name="port" value="6379" />
<property name="password" value="" />
<property name="timeout" value="3600" />
<property name="poolConfig" ref="jedisPoolConfig" />
<property name="usePool" value="true" />
bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory" />
bean>
<bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="maxInactiveIntervalInSeconds" value="1800" />
bean>
注意:请将这个过滤器配置在所有过滤器的第一位
<filter>
<filter-name>springSessionRepositoryFilterfilter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxyfilter-class>
filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
到此为止,Spring-session已经集成到Spring项目里
如果想在session中保存一个对象,直接如下写是会报错的
Session.setAttribute("users", user)
如果要保存对象,有一个前提,那就是User
类必须实现了 Serializable
接口,这样Spring-session才能对user进行序列化,从而存储在redis里.
1.使用Spring Session做分布式会话管理
最近有个项目是使用Jersey构建的Restful项目,而且要开发对非web的客户端接口,也就是没法使用cookie.所幸的是Spring Session还支持另一种方式:将sessionid存储在Httpheader里,这样可以不借助cookie而获取sessionid从而回去session
1.修改Spring配置文件
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"/>
<bean id="httpSessonStrategy" class="org.springframework.session.web.http.HeaderHttpSessionStrategy"/>
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="127.0.0.1" />
<property name="port" value="6379" />
<property name="password" value="" />
<property name="timeout" value="3600" />
<property name="poolConfig" ref="jedisPoolConfig" />
<property name="usePool" value="true" />
bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory" />
bean>
<bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="maxInactiveIntervalInSeconds" value="1800" />
<property name="httpSessionStrategy" ref="httpSessonStrategy"/>
bean>
2.添加Filter,这里和上面的Web.xml配置
一样,就不贴代码了
3.测试
首先,定义一个控制器,包含一个set和get,模拟存储和取出session
/**
* @author : Amayadream
* @date : 2016.03.10 19:05
*/
@Controller
@RequestMapping(value = "test")
public class TestController{
@RequestMapping(value = "set")
public String set(HttpSession session){
session.setAttribute("userid", "Amayadream");
return "index";
}
@RequestMapping(value = "get")
@ResponseBody
public String get(HttpSession session){
return "Hello," + session.getAttribute("userid");
}
}
index.jsp如下
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<html>
<head>
<meta charset=utf-8">
<title>indextitle>
head>
<body>
${userid}
body>
html>
启动项目,这里我用的是RestClient火狐插件来测试
①set,这里可以看到结果是成功了(跳转到了index,没截图),而且header里有一个x-auth-token
,它的值就是对应的sessionid
②get,这里我们在请求的时候添加header,看看能不能取到值
很明显并没有取到值,而且x-auth-token
的值变了,相当于重新分配给你一个session
③get,这里在请求的时候带上①中的sessionid
这样,就成功的取到了值