Java EE 项目,分布式部署,如何管理 session? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vivaldi
V2EX    Java

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

  •  
  •   vivaldi 2017-09-09 11:39:50 +08:00 4601 次点击
    这是一个创建于 2957 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我们现在项目使用的是 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     Solana     2987 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 98ms UTC 14:19 PVG 22:19 LAX 07:19 JFK 10:19
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86