Spring项目集成Spring-Session以及可能遇到的问题
2016-03-07 20:21
721 查看
Spring项目集成Spring-Session以及可能遇到的问题
一.准备Jar包
<!-- Spring Session Start --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session</artifactId> <version>1.1.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.6.4.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.0</version> </dependency> <!-- Spring Session End -->
非maven自行下载,需要注意多下一个
commons-pool2-2.3.jar
maven不必下载,maven已经自动解决依赖了
二.安装Redis
我的机器是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
三.集成到Spring项目里
1.Spring配置文件
<!-- Spring-Session 配置开始 --> <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> <!-- 将session放入redis --> <bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"> <property name="maxInactiveIntervalInSeconds" value="1800" /> </bean> <!-- Spring-Session 配置结束 -->
2.Web.xml配置
注意:请将这个过滤器配置在所有过滤器的第一位<!-- Spring Session配置开始 --> <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> <!-- Spring Session配置结束 -->
到此为止,Spring-session已经集成到Spring项目里
四.可能遇到的问题
1.Session.setAttribute()
如果想在session中保存一个对象,直接如下写是会报错的Session.setAttribute("users", user)
如果要保存对象,有一个前提,那就是
User类必须实现了
Serializable接口,这样Spring-session才能对user进行序列化,从而存储在redis里.
五.参考资料
1.使用Spring Session做分布式会话管理六.补充(2016.3.15)
最近有个项目是使用Jersey构建的Restful项目,而且要开发对非web的客户端接口,也就是没法使用cookie.所幸的是Spring Session还支持另一种方式:将sessionid存储在Httpheader里,这样可以不借助cookie而获取sessionid从而回去session1.修改Spring配置文件
<!-- Spring-Session 配置开始 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"/> <!-- 替代默认使用cookie,这里使用的是httpheader --> <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> <!-- 将session放入redis --> <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> <!-- Spring-Session 配置结束 -->
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>index</title> </head> <body> ${userid} </body> </html>
启动项目,这里我用的是RestClient火狐插件来测试
①set,这里可以看到结果是成功了(跳转到了index,没截图),而且header里有一个
x-auth-token,它的值就是对应的sessionid
②get,这里我们在请求的时候添加header,看看能不能取到值
很明显并没有取到值,而且
x-auth-token的值变了,相当于重新分配给你一个session
③get,这里在请求的时候带上①中的sessionid
这样,就成功的取到了值
相关文章推荐
- 一个java代码生成器的简单实现
- Struts2入门示例教程
- java设计模式之单例模式
- java 异常
- LeetCode : Merge Two Sorted Lists [java]
- java背景音乐
- 新浪微博时间转换工具类
- Java设计模式-设计模式的六种原则
- Eclipse中恢复已删除文件和还原到先前版本
- 《Java实战开发经典》第六章6.1
- LeetCode : Valid Parentheses [java]
- 读取一个指定的*.Java文件,并打印在控制台上
- 怎么用Eclipse打开一个写好的项目
- Java基础复习,整理知识点
- JAVA Swing
- 出现R.java文件不见了的情况,或者R.java导入错误
- Java——面向对象(二)
- Myeclipse/Eclipse安装Maven环境
- RSA 加密解密 关于javax.crypto.BadPaddingException: Blocktype错误的几种解决方法
- 如何修改java String