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

2017-09-09 11:39:50 +08:00
 vivaldi
我们现在项目使用的是 CAS 单点登陆作为登陆认证服务,在登陆时从 CAS 中同步 session 到主应用,使用 redis 存储 session。之前我们的 session 超时时间配置为 CAS 和主应用时间保持一样设置为 10 分钟超时。

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

因为超时时间是设置在 web.xml 中的,web 项目启动也没办法注入这个值。我搜到 sof 中有个答案,使用实现 HttpSessionListener,然后在 session 创建的时候 setMaxInactiveInterval,但是我这样做没起作用。请教 V2 上的大神们,这个需求要怎样实现呢?
4067 次点击
所在节点    Java
8 条回复
sfwn
2017-09-09 12:25:17 +08:00
redis key 可以设置超时时间
yidinghe
2017-09-09 12:34:43 +08:00
用其他 cookie 来代替缺省的 session,超时时间直接设在 redis 里,浏览器设置超时 30 天。也就是说,浏览器提交的 sessionid 一旦 redis 查不到,就要求重新登录,登录成功后
yidinghe
2017-09-09 12:35:33 +08:00
(手滑)登录成功后同时往浏览器和 redis 记录新的 sessionid 即可。
caixiexin
2017-09-09 12:36:43 +08:00
可以尝试另一个思路:
CAS 认证完成后,由应用自己管理 session,应用预留登出接口,接受 CAS 统一登出的通知。然后应用的 Session 时长,爱多久就多久,放在 redis 里可以设置 redis 的缓存 expire 时间。
这样有个好处是,CAS 只作为认证服务器,不管理会话,CAS 哪天挂了,也不会影响已经登录的用户。
hantsy
2017-09-09 14:54:43 +08:00
扔掉 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
2017-09-09 16:16:53 +08:00
@hantsy 谢谢,扔掉 CAS 代价有点大,不过我用 Spring Session 代替了之前得 redis session 共享方案,并且替换掉了由 Tomcat 来管理 session,这样在我们项目中需要的改动比较小。替换 CAS 首先领导那里就比较难过,其次还是需要一些工作量。
vivaldi
2017-09-09 16:20:19 +08:00
@caixiexin 感谢分享,很好的思路,比我们现在灵活多了,后面考虑能不能改成这种模式,现在我已经先用 Spring Session 给实现掉了,毕竟面向 deadline 编程 :)
hantsy
2017-09-09 20:55:34 +08:00
@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 显然已经不重要了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/389368

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX