您的位置:首页 > 编程语言 > Java开发

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从而回去session

1.修改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



这样,就成功的取到了值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: