Redis+Spring Session 实现单点登录

在最初,我们的User模块是这样的,用户登录信息存入Tomcat容器自带的Session中,这也是通用的做法,也很简单,适合单服务器部署:

v1.0 版本

/**
     *用户登录
     */
    @RequestMapping(value = "login.do",method = RequestMethod.GET)
    @ResponseBody
    public ServerResponse login(String username, String password, HttpSession session){

        ServerResponse response = iUserService.login(username, password);
        if (response.isSuccess()) {
            session.setAttribute(Const.CURRENT_USER,response.getData());
        }
        return response;
    }

v2.0版本

此时随着系统演进,服务器升级为集群模式,或多子系统等架构,Tomcat自带的Session管理是基于Http协议的无状态对象,故我们将Session集中管理起来,放入第三方,比如Redis缓存中,所有服务节点重Session会话中心进行登录认证。单点登录的实现方式为 Session存入Redis,token写入Cookie,用户带着Cookie中的token来进行认证,此时,我们使用原生方式实现,代码会是这样:

/**
     *用户登录
     */
    @RequestMapping(value = "login.do",method = RequestMethod.GET)
    @ResponseBody
    public ServerResponse login(String username, String password, HttpSession session,HttpServletResponse httpServletResponse){

        ServerResponse response = iUserService.login(username, password);
        if (response.isSuccess()) {
//            session.setAttribute(Const.CURRENT_USER,response.getData());
            //写入cookie
            CookieUtil.writeLoginToken(httpServletResponse,session.getId());
            //将登录用户信息存入redis,有效时间为30分钟
            RedisPoolUtil.setEx(session.getId(), JsonUtil.obj2string(response.getData()), Const.RedisCacheExTime.REDIS_SESSION_EXTIME);
        }
        return response;
    }

v3.0 从上面的实现方式也看出来了,在login方法中加入了读写cookie和redis的逻辑,在我们的业务中通常会有很多地方需要对用户信息进行认证,故这样的代码对业务代码的侵入性很大,很多地方都要写这些业务无关代码。

这时我们使用Spring Session提供的方式来实现分布式的Session管理,其原理是与V2.0一样的,不过Spring对其进行的封装和优化。集成Spring Session之后,我们的代码于是就又变回了V1.0的写法:

这样的好处就是,在系统演进的过程中,我们不需要改变原有代码,迭代的复杂度也大大降低。

 @RequestMapping(value = "login.do",method = RequestMethod.GET)
    @ResponseBody
    public ServerResponse login(String username, String password, HttpSession session){

        ServerResponse response = iUserService.login(username, password);
        if (response.isSuccess()) {
            session.setAttribute(Const.CURRENT_USER,response.getData());
        }
        return response;
    }

Spring Session配置

1 引入依赖


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

2 在web.xml中加入过滤器DelegatingFilterProxy


    
        springSessionRepositoryFilter
        org.springframework.web.filter.DelegatingFilterProxy
    
    
        springSessionRepositoryFilter
        *.do
    

3 在Spring的配置文件中添加配置


        
        
    


    

    
    
        
    

    
    
        
        
        
    

5 小结

通过Redis+Spring Session实现的单点登录系统对业务代码侵入性非常小,在单服务器时使用session存取用户信息,在集群模式时代码无需改变,只要引入Spring Session相关配置即可。

 

Contact

  • 作者:小罗
  • 出处:https://blog.csdn.net/sinat_25295611/article/details/80446506
  • Email:[email protected]
  • 版权归作者所有,转载请注明出处
  • Wechat:扫一扫关注公众号,小罗技术笔记,专注于开发技术的研究与知识分享,第一时间送达实用干货文章。

Redis+Spring Session 实现单点登录_第1张图片

你可能感兴趣的:(后端技术)