V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
vivaldi
V2EX  ›  Java

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

  •  
  •   vivaldi · Sep 9, 2017 · 4978 views
    This topic created in 3163 days ago, the information mentioned may be changed or developed.
    我们现在项目使用的是 CAS 单点登陆作为登陆认证服务,在登陆时从 CAS 中同步 session 到主应用,使用 redis 存储 session。之前我们的 session 超时时间配置为 CAS 和主应用时间保持一样设置为 10 分钟超时。

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

    因为超时时间是设置在 web.xml 中的,web 项目启动也没办法注入这个值。我搜到 sof 中有个答案,使用实现 HttpSessionListener,然后在 session 创建的时候 setMaxInactiveInterval,但是我这样做没起作用。请教 V2 上的大神们,这个需求要怎样实现呢?
    8 replies    2017-09-09 20:55:34 +08:00
    sfwn
        1
    sfwn  
       Sep 9, 2017 via Android   ❤️ 1
    redis key 可以设置超时时间
    yidinghe
        2
    yidinghe  
       Sep 9, 2017 via Android   ❤️ 1
    用其他 cookie 来代替缺省的 session,超时时间直接设在 redis 里,浏览器设置超时 30 天。也就是说,浏览器提交的 sessionid 一旦 redis 查不到,就要求重新登录,登录成功后
    yidinghe
        3
    yidinghe  
       Sep 9, 2017 via Android   ❤️ 1
    (手滑)登录成功后同时往浏览器和 redis 记录新的 sessionid 即可。
    caixiexin
        4
    caixiexin  
       Sep 9, 2017   ❤️ 1
    可以尝试另一个思路:
    CAS 认证完成后,由应用自己管理 session,应用预留登出接口,接受 CAS 统一登出的通知。然后应用的 Session 时长,爱多久就多久,放在 redis 里可以设置 redis 的缓存 expire 时间。
    这样有个好处是,CAS 只作为认证服务器,不管理会话,CAS 哪天挂了,也不会影响已经登录的用户。
    hantsy
        5
    hantsy  
       Sep 9, 2017   ❤️ 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
       Sep 9, 2017
    @hantsy 谢谢,扔掉 CAS 代价有点大,不过我用 Spring Session 代替了之前得 redis session 共享方案,并且替换掉了由 Tomcat 来管理 session,这样在我们项目中需要的改动比较小。替换 CAS 首先领导那里就比较难过,其次还是需要一些工作量。
    vivaldi
        7
    vivaldi  
    OP
       Sep 9, 2017
    @caixiexin 感谢分享,很好的思路,比我们现在灵活多了,后面考虑能不能改成这种模式,现在我已经先用 Spring Session 给实现掉了,毕竟面向 deadline 编程 :)
    hantsy
        8
    hantsy  
       Sep 9, 2017   ❤️ 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 显然已经不重要了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5497 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 62ms · UTC 09:19 · PVG 17:19 · LAX 02:19 · JFK 05:19
    ♥ Do have faith in what you're doing.