Spring+Redis实现session共享

首先需要到[https://redis.io/download
下载并安装一个Redis Server。

接下来在项目POM中引入Spring Session需要的依赖:


      org.springframework.session
      spring-session-data-redis
      1.2.1.RELEASE

目前我们的项目spring-core的版本为3.2.13.RELEASE,若想使用更高版本的spring-session-data-redis请注意一下spring依赖间版本需要互相兼容,因为3.2.13.RELEASE版本较低,导致如果使用更高版本的spring-session-data-redis,运行时报了一个找个不到某个构造函数的错误。

spring-session.xml配置:


        
        


        


        
        


        
        
        
        
        
        
 

参数可以按需配置,这里redis server的密码修改为了specialpassword,spring不与tomcat共用SESSION ID,它有自己的SESSION,在COOKIE中默认名为SESSION(参照tomcat的JSESSIONID),当然你可以通过修改cookieName参数修改默认名称。
web.xml配置:


        springSessionRepositoryFilter
        org.springframework.web.filter.DelegatingFilterProxy


        springSessionRepositoryFilter
        /*
 

这里配置的时候要注意,一般要把springSessionRepositoryFilter配置为web.xml中所有filter中的第一位,因为只有配置在最前面,才能使得请求第一个经过该filter,从而后续处理中的所有request使用的session都是经过spring包装的redis session。
Spring redis处理的方式其实是将原始的HttpServletRequest通过HttpServletRequestWrapper类重写getSession()方法实现的,并且在filter中它以偷天换日的方式将原始的HttpRequestServlet用该类替换了。

@Controller
@RequestMapping("/system/test")
public class TestController {
@RequestMapping(method = RequestMethod.GET)
    @ResponseBody
    public Map public_key(HttpServletRequest request) {
        //配置完成以后在这里通过request.getSession()取到的就是通过redis取得的内容了
        return null;
    }
}

Spring中还有一种获取HttpServletRequest 的方式,即自动注入:

@Autowired
private HttpServletRequest request;

通过这种方式拿到的request,你会发现直接通过request.getSession()拿到的并不是你想要的redis session而是原始的session。我通过调试发现可以通过

HttpSession session = (HttpSession)request.getAttribute("javax.servlet.http.HttpServletRequestWrapper");

(机智的spring已经帮你把他的引用放在原始request的attribute中了) 的方式取得你想要的redis session。因为这里自动注入的其实只是一个spring封装过的HttpServletRequest的代理类,他传的值和controller中获取的是不一样的。

Spring session只是共享session的一种方式,还有一种比较常见的方式是通过tomcat的session管理来处理共享session。Spring session的好处在于它并不依赖于tomcat容器,与tomcat很好的解耦了,包括他的配置都更加的方便,并且tomcat不管是版本7还是8都可以使用同一套方式。不过我相信最适合项目的方式就是最好的方式。

你可能感兴趣的:(Spring+Redis实现session共享)