本指南描述了如何通过java配置来让Spring Session透明地使用Redis进行web项目的Session存储。
①
通过@EnableRedisHttpSession注解,将会创建一个SessionRepositoryFilter的Spring Bean。通过这个Filter,能够把HttpSession替换成Spring Session的实现。
在这个实例
中,Spring Session将会把Session保存到Redis。
①第一步是创建一个继承AbstractHttpSessionApplicationInitializer的Java类。这能让上文中的创建的Filter Spring Bean注册到Servlet容器中,并且对所有的请求生效。
1、更新依赖
在使用Spring Session之前,你必须保证已经更新了项目依赖。如果你使用的是Maven,请确保添加了一下 dependencies。
<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.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>1.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.0.7.RELEASE</version>
</dependency>
</dependencies>
|
2、Spring Java 配置
添加了必须的依赖之后,我们开始创建Spring配置的Java类。这个Spring配置类的作用是,通过创建一个Servlet Filter来让Spring Session实现代替原有的HttpSession实现。Spring 配置类如下:
@EnableRedisHttpSession ①
public class Config {
@Bean
public JedisConnectionFactory connectionFactory(){
JedisConnectionFactory connect = new JedisConnectionFactory(); ②
connect.setPort(6379);
connect.setHostName("192.168.99.100");
return connect;
}
}
|
② 然后我们创建了一个JedisConnectionFactory用来连接Spring Session和Redis。如果没有设置Redis的port和host,JedisConnectFactory将会使用默认的地址(localhost)和端口(6379)。具体能容可参考reference documentation
3、Java Servlet 容器初始化
我们通过上面说的config类来创建了SessionRepositoryFilter的Spring,用来把HttpSession替换成Spring Session自定义实现的Session管理。但是,为了让这个Filter能发挥作用,Spring还需要对Config类进行加载。所以,最后我们得保证在Servlet容器(例如Tomcat)中,这个Filter能够对每一个请求产生作用。幸好,Spring Session提供了一个有效的类(AbstractHttpSessionApplication Initializer),让这一系列步骤变得十分加单。
示例如下:
public class Initializer extends
AbstractHttpSessionApplicationInitializer {
①
public Initializer(){
super(Config.class);
②
}
}
|
②AbstractHttpSessionApplicationInitializer 提供了让Spring 加载Config类的机制。
4、HttpSession 示例应用
指南提供了一个HttpSession的简单示例。为了让这个示例能正常运行,需要先在你的本地安装Redis 2.8+,默认端口为6379,让JedisConnectionFactory能够连接到一个Redis Server。
示例代码如下:
@WebServlet("/session")
public class SessionServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String attributeName = req.getParameter("userName");
String attributeValue = req.getParameter("tiger");
req.getSession().setAttribute(attributeName, attributeValue);
resp.sendRedirect(req.getContextPath() + "/");
}
private static final long serialVersionUID = 2878267318695777395L;
}
|
在Servlet容器中部署示例应用,然后通过浏览器访问http://localhost:8080/springsessionDemo/session。访问之后即可以在Redis中看到Session被保存。
示例项目下载地址:http://pan.baidu.com/s/1kVdIzCr