从会话超时中排除一些 URL
Exclude some URLs from the session timeout
我有一个会话超时为 30 分钟的 Web 应用程序。设计是当会话被删除时,用户会自动注销并需要重新登录。
问题是我的网页上有一个新闻自动收报机,它通过 AJAX 调用每 5 分钟更新一次。 newsticker AJAX 调用自然会重置会话超时,因此用户不会注销。
我正在考虑通过编写一个过滤器来实现我自己的不活动检测器,该过滤器会在用户 gets/posts 一个页面时更新 lastActive
变量(存储在会话中),新闻代码除外。
然后我在想,也许有一种方法可以排除某些调用重置会话超时。所以我搜索并找到了一些与 asp 有关的答案,但没有找到 jsp 和 Weblogic 的答案。
有没有办法排除某些 URL:s 重置会话超时?
由于我无法通过配置找到任何方法来执行此操作,因此我最终编写了一个过滤器,在没有用户 activity 的情况下经过足够长的时间后使会话无效。我已经有另一个过滤器可以将没有会话的用户重定向到登录页面。我在过滤器链中的授权过滤器之前添加了 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;
}
@Klas Lindback:我没有足够的权限 comment.So 我将其发布为 answer.To 找到最后一个 activity,你不需要手册 calculation.Try下面的方法
session.getLastAccessedTime()
无论如何这不会改变您的实施
我有一个会话超时为 30 分钟的 Web 应用程序。设计是当会话被删除时,用户会自动注销并需要重新登录。
问题是我的网页上有一个新闻自动收报机,它通过 AJAX 调用每 5 分钟更新一次。 newsticker AJAX 调用自然会重置会话超时,因此用户不会注销。
我正在考虑通过编写一个过滤器来实现我自己的不活动检测器,该过滤器会在用户 gets/posts 一个页面时更新 lastActive
变量(存储在会话中),新闻代码除外。
然后我在想,也许有一种方法可以排除某些调用重置会话超时。所以我搜索并找到了一些与 asp 有关的答案,但没有找到 jsp 和 Weblogic 的答案。
有没有办法排除某些 URL:s 重置会话超时?
由于我无法通过配置找到任何方法来执行此操作,因此我最终编写了一个过滤器,在没有用户 activity 的情况下经过足够长的时间后使会话无效。我已经有另一个过滤器可以将没有会话的用户重定向到登录页面。我在过滤器链中的授权过滤器之前添加了 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;
}
@Klas Lindback:我没有足够的权限 comment.So 我将其发布为 answer.To 找到最后一个 activity,你不需要手册 calculation.Try下面的方法
session.getLastAccessedTime()
无论如何这不会改变您的实施