1

web.xml包含:

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

Springsecurity-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());
4

1 回答 1

2

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

long oneDay = 86400000;
if ((System.currentTimeMillis() - session.getCreationTime()) > oneDay) {
    session.invalidate();
}
于 2013-11-13T22:08:54.353 回答