从会话超时中排除一些 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()

Oracle docs

无论如何这不会改变您的实施