在Spring项目中停止会话延长

时间:2013-11-13 14:55:35

标签: java-ee spring-mvc spring-security

web.xml包含:

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

Spring security-context.xml具有自定义OAuth 2.0授权过滤器:

<sec:http use-expressions="true" auto-config="false"
          entry-point-ref="oauthEntryPoint"
          authentication-manager-ref="oauthAuthenticationManager">
    <sec:custom-filter position="FORM_LOGIN_FILTER" ref="myFilter" />
    ...
</sec:http>

由于未调用attemptAuthentication的较长会话有效myFilter方法。如果会话过期attemptAuthentication方法请求自定义OAuth 2.0服务器的REST API以验证OAuth令牌有效性(然后重定向到登录页面或延长会话)。

会话超时30分钟,OAuth令牌有1天超时。

如果用户在30分钟内保持活动 - 会话自动延长,当OAuth令牌无效时,用户可以登录很多天!

如何使首次登录访问的会话无效,而不是从上次访问网站时开始?

更新http://forum.spring.io/forum/spring-projects/security/725894-help-with-stoping-sesstion-prolongation

上查看我的问题

我阅读了Servlet 2.1规范。似乎该会话由提供Servlet API的容器管理。它具有会话超时,以避免旧的非活动会话中的内存过载。

所以你无法控制会话到期。要实现我的目标,我可以将特殊的创建时间戳与会话相关联,并检查它是否过期。

但Will Keeling表示此信息已存储在session

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
  HttpServletRequest request = (HttpServletRequest) req;
  HttpSession session = request.getSession(false);
  if (session == null)
    logger.warn("session is null");
  else
    logger.warn("session created at {}", session.getCreationTime());

1 个答案:

答案 0 :(得分:2)

您可以实现自己的servlet过滤器,该过滤器会检查会话创建时间,如果在固定时间段之后访问会话,则会使会话无效。

long oneDay = 86400000;
if ((System.currentTimeMillis() - session.getCreationTime()) > oneDay) {
    session.invalidate();
}