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