Spring项目集成Spring-Session以及可能遇到的问题

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,往下滑就能看到

解压之后内容如下(文档给我删了..不要在意)
Redis

注意这个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
set
②get,这里我们在请求的时候添加header,看看能不能取到值
get
get
很明显并没有取到值,而且x-auth-token的值变了,相当于重新分配给你一个session
③get,这里在请求的时候带上①中的sessionid
get
这样,就成功的取到了值

猜你喜欢

转载自blog.csdn.net/Amayadream/article/details/50822018