我有一个30分钟会话超时的网络应用。设计是当会话被删除时,用户会自动注销并需要再次登录。
问题是我的网页上有一个新闻自动收录器,它通过AJAX呼叫每5分钟更新一次。 newsticker AJAX调用自然会重置会话超时,因此用户不会被注销。
我正在考虑通过编写一个过滤器来实现我自己的不活动检测器,该过滤器会在用户获取/发布页面时更新lastActive
变量(存储在会话中),新闻报道除外。
然后我在想,也许有办法排除某些调用重置会话超时。所以我搜索并找到了一些与asp有关的答案,但对于jsp和Weblogic却没有。
有没有办法排除某些网址:重置会话超时?
答案 0 :(得分:1)
由于我无法通过配置找到任何方法,因此我最终编写了一个过滤器,当没有用户活动时已经过了足够的时间,会使会话无效。我已经有了另一个过滤器,可以将没有会话的用户重定向到登录页面。我在过滤器链中的授权过滤器之前添加了SessionTimeoutFilter
。
以下代码略有剥离。我删除了所有内部依赖项,这就是为什么所有值都是硬编码的。
public class SessionTimeoutFilter
implements Filter
{
private final long TIMEOUT = 1800L; // 30 minutes in seconds
private final String LAST_ACTIVITY = "LAST_ACTIVITY";
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (request instanceof HttpServletRequest) {
HttpServletRequest theRequest = (HttpServletRequest) request;
Long now = (new Date()).getTime();
HttpSession session = theRequest.getSession(false);
if (session != null) {
Long lastActivity = (Long) session.getAttribute(LAST_ACTIVITY);
if (lastActivity == null) {
// The first call for this session.
lastActivity = now;
}
if (now - lastActivity > TIMEOUT*1000L) {
// User timed out.
session.invalidate();
} else if (isUserCall(theRequest)) {
// Reset inactivity timer
session.setAttribute(LAST_ACTIVITY, now);
}
}
}
chain.doFilter(request, response);
}
/**
* @return true if the URI indicates user activity,
* false if it is an automatic call
*/
private boolean isUserCall(HttpServletRequest request) {
String uri = request.getRequestURI();
if (uri.contains("NewsTicker")) {
return false;
}
return true;
}
答案 1 :(得分:0)
@Klas Lindback:我没有足够的权限发表评论。因此,我将此作为答案发布。要查找上一个活动,您不需要进行手动计算。请尝试以下操作方法
session.getLastAccessedTime()
无论如何都不会改变你的实现