从会话超时中排除某些URL

时间:2016-04-04 11:08:09

标签: jsp session-timeout weblogic12c

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

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

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

然后我在想,也许有办法排除某些调用重置会话超时。所以我搜索并找到了一些与asp有关的答案,但对于jsp和Weblogic却没有。

有没有办法排除某些网址:重置会话超时?

2 个答案:

答案 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()

Oracle docs

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