【问题标题】:Exclude some URLs from the session timeout从会话超时中排除一些 URL
【发布时间】:2016-04-04 11:08:09
【问题描述】:

我有一个会话超时 30 分钟的网络应用程序。设计是当会话被删除时,用户会自动注销并需要重新登录。

问题是我的网页上有一个新闻代码,它通过 AJAX 调用每 5 分钟更新一次。 newsticker AJAX 调用自然会重置会话超时,因此用户不会被注销。

我正在考虑通过编写一个过滤器来实现我自己的不活动检测器,该过滤器会在用户获取/发布页面时更新lastActive 变量(存储在会话中),新闻代码除外。

然后我在想,也许有一种方法可以将某些调用排除在重置会话超时之外。所以我搜索并找到了一些与asp相关的答案,但没有找到jsp和Weblogic的答案。

有没有办法从重置会话超时中排除某些 URL:s?

【问题讨论】:

  • 你不能把代码放在一个单独的 WAR 文件中,它有自己的 web.xml,会有自己的超时时间吗?
  • @radimpe 我可以,但是当我加起来我需要做的事情时,它似乎比编写过滤器需要更多的工作和更复杂的解决方案。该应用程序目前只有一个网络应用程序。我也不确定如何使用使用单独会话的第二个 Web 应用透明地处理授权和身份验证等事情。

标签: jsp session-timeout weblogic12c


【解决方案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;
    }

【讨论】:

    【解决方案2】:

    @Klas Lindback :我没有足够的权限发表评论。所以我将其发布为答案。要查找最后一个活动,您不需要手动计算。尝试以下方法

    session.getLastAccessedTime()
    

    Oracle docs

    无论如何这不会改变你的实现

    【讨论】:

    • session.getLastAccessedTime() 不适合我,因为它会被任何调用重置,包括我想从超时计算中排除的 newsticker Ajax 调用。
    • 它正在重置什么?
    猜你喜欢
    • 2011-06-06
    • 2023-03-29
    • 2016-09-23
    • 1970-01-01
    • 2012-10-15
    • 2014-09-06
    • 2013-11-16
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多