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());
答案 0 :(得分:2)
您可以实现自己的servlet过滤器,该过滤器会检查会话创建时间,如果在固定时间段之后访问会话,则会使会话无效。
long oneDay = 86400000;
if ((System.currentTimeMillis() - session.getCreationTime()) > oneDay) {
session.invalidate();
}