V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vivaldi
V2EX  ›  Java

Java EE 项目,分布式部署,如何管理 session?

  •  
  •   vivaldi · 2017-09-09 11:39:50 +08:00 · 4271 次点击
    这是一个创建于 2664 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我们现在项目使用的是 CAS 单点登陆作为登陆认证服务,在登陆时从 CAS 中同步 session 到主应用,使用 redis 存储 session。之前我们的 session 超时时间配置为 CAS 和主应用时间保持一样设置为 10 分钟超时。

    但是客户反馈超时时间太短,领导想要超时时间能够配置在外部配置文件中,然后启动项目的时候能够从配置文件中读取时间来设置,请问在这种要求下,怎样能够实现呢?

    因为超时时间是设置在 web.xml 中的,web 项目启动也没办法注入这个值。我搜到 sof 中有个答案,使用实现 HttpSessionListener,然后在 session 创建的时候 setMaxInactiveInterval,但是我这样做没起作用。请教 V2 上的大神们,这个需求要怎样实现呢?
    8 条回复    2017-09-09 20:55:34 +08:00
    sfwn
        1
    sfwn  
       2017-09-09 12:25:17 +08:00 via Android   ❤️ 1
    redis key 可以设置超时时间
    yidinghe
        2
    yidinghe  
       2017-09-09 12:34:43 +08:00 via Android   ❤️ 1
    用其他 cookie 来代替缺省的 session,超时时间直接设在 redis 里,浏览器设置超时 30 天。也就是说,浏览器提交的 sessionid 一旦 redis 查不到,就要求重新登录,登录成功后
    yidinghe
        3
    yidinghe  
       2017-09-09 12:35:33 +08:00 via Android   ❤️ 1
    (手滑)登录成功后同时往浏览器和 redis 记录新的 sessionid 即可。
    caixiexin
        4
    caixiexin  
       2017-09-09 12:36:43 +08:00   ❤️ 1
    可以尝试另一个思路:
    CAS 认证完成后,由应用自己管理 session,应用预留登出接口,接受 CAS 统一登出的通知。然后应用的 Session 时长,爱多久就多久,放在 redis 里可以设置 redis 的缓存 expire 时间。
    这样有个好处是,CAS 只作为认证服务器,不管理会话,CAS 哪天挂了,也不会影响已经登录的用户。
    hantsy
        5
    hantsy  
       2017-09-09 14:54:43 +08:00   ❤️ 1
    扔掉 CAS 吧。

    Spring 官方子项目,Spring Session 支持 JDBC, Redis, Hazacast,Mongo 等,实现了 Servlet Session API, 通过 Servlet Wrapper(HttpRequestWrapper, HttpReponseWrapper) 接口运行替换了 Servlet Session, 所有 Servlet Session Event 都是自动支持。超时配置一下就行了,在 Spring Boot 在配置文件也可以设置。

    Spring Session+Redis 已经应用多年,WEB, REST APIs 全部适合。一般来讲,传统 WEB 用 Cookie,REST 用 X-Auth-Token 完成 Authentication。

    REST 使用例子: https://github.com/hantsy/spring-microservice-sample 看 Readme 文档。
    vivaldi
        6
    vivaldi  
    OP
       2017-09-09 16:16:53 +08:00
    @hantsy 谢谢,扔掉 CAS 代价有点大,不过我用 Spring Session 代替了之前得 redis session 共享方案,并且替换掉了由 Tomcat 来管理 session,这样在我们项目中需要的改动比较小。替换 CAS 首先领导那里就比较难过,其次还是需要一些工作量。
    vivaldi
        7
    vivaldi  
    OP
       2017-09-09 16:20:19 +08:00
    @caixiexin 感谢分享,很好的思路,比我们现在灵活多了,后面考虑能不能改成这种模式,现在我已经先用 Spring Session 给实现掉了,毕竟面向 deadline 编程 :)
    hantsy
        8
    hantsy  
       2017-09-09 20:55:34 +08:00   ❤️ 1
    @vivaldi

    代价真的不大。

    用一个单独的 Auth 服务作安全认证(带 Login 界面),其它应用如果 Authentication Failed,返回 /login 时, 直接 Redirect (带上返回应用地址 Url )到 Auth 登录界面, 登录成功后,Redirected 到之前要返回的应用 Url (带上 Token, 即 Session ID,当然你可以加密) 返回到应用界面,所在的应用加一个 Filter 解析一下这个返回的 Token,设置 Cookie 即可,大功告成。

    至于超时设置 Spring Session 很容易,另外 Session 在 Redis 中,你想怎么管理都行,暴露到管理界面,随时可以删除(踢掉)哪个连接的 Session。

    另外,Spring Cloud Security 用 OAuth 2 可以完成这个 SSO 过程, 一个 @EnableOAuth2Sso 可以搞定了。看官方教程 https://spring.io/guides/tutorials/spring-security-and-angular-js/

    当然,我个人项目已经好几年没用传统 MVC,上次使用 CAS 已经是好久的事情(我基本没印象了),现在只使用 REST APIs (可能+Websocket ) 与外部交互,SSO 显然已经不重要了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   991 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:58 · PVG 05:58 · LAX 13:58 · JFK 16:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.