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

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

一.准备Jar包

    
    <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已经自动解决依赖了

二.安装Redis

我的机器是windows,所以下载的是windows版本的.Redis官方只支持linux,这里用的是MS Open Tech开发的windows版本,地址在这redis for windows,记得下载zip版本,最新版本3.0.501,往下滑就能看到

解压之后内容如下(文档给我删了..不要在意)
Spring项目集成Spring-Session以及可能遇到的问题_第1张图片

注意这个start.bat是我自己建的,内容如下:

redis-server  redis.windows.conf 

点击start.bat就能启动redis,具体配置不说了,自行google

三.集成到Spring项目里

1.Spring配置文件

    
    <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>
    

2.Web.xml配置

注意:请将这个过滤器配置在所有过滤器的第一位

  
  <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项目里

四.可能遇到的问题

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配置文件

    
    <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
Spring项目集成Spring-Session以及可能遇到的问题_第2张图片
②get,这里我们在请求的时候添加header,看看能不能取到值
Spring项目集成Spring-Session以及可能遇到的问题_第3张图片
Spring项目集成Spring-Session以及可能遇到的问题_第4张图片
很明显并没有取到值,而且x-auth-token的值变了,相当于重新分配给你一个session
③get,这里在请求的时候带上①中的sessionid
Spring项目集成Spring-Session以及可能遇到的问题_第5张图片
这样,就成功的取到了值

你可能感兴趣的:(Java)