HTTP会话:如何配置不会更改会话到期的URL?

时间:2016-09-19 03:32:29

标签: servlets web.xml httpsession

我在我的应用程序中轮询每5分钟执行一次的HTTP请求。

我想配置这些网址,以免更改会话过期。 否则我的会话永远不会过期(我不想要它)。 无法在web.xml和HttpSession文档中找到它。

怎么可能这样做?

非常重要的澄清:请求应该通过身份验证。 这意味着请求应附加到已经过身份验证的JsessionID。

澄清(已添加2)

无论用户是否保持活动状态,我都不希望会话过期。我希望会话将在用户不活动时到期,如果用户在UI上工作,则不会过期。我希望会话将在用户不活动时到期,尽管每5分钟有一次轮询请求

4 个答案:

答案 0 :(得分:2)

标准Servlet API不支持此功能。

最好的办法是创建一个全局servlet过滤器(带@WebFilter("/*")),每当特定URL到达服务器时减少HttpSession#setMaxInactiveInterval(),并将其恢复为其他URL的默认值。它只需要一些基本的数学运算。

实现的相关位可能如下所示:

private static final int DEFAULT_EXPIRE_TIME_IN_SECONDS = 1800;
private static final String SKIP_EXPIRE_TIME_ON_URI = "/somePollServlet";

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpSession session = request.getSession();

    if (request.getRequestURI().equals(request.getContextPath() + SKIP_EXPIRE_TIME_ON_URI)) {
        long lastAccessedTime = session.getLastAccessedTime();
        long currentTime = System.currentTimeMillis();
        int newExpireTime = DEFAULT_EXPIRE_TIME_IN_SECONDS - (int) ((currentTime - lastAccessedTime) / 1000);
        session.setMaxInactiveInterval(newExpireTime);
    }
    else {
        session.setMaxInactiveInterval(DEFAULT_EXPIRE_TIME);
    }

    chain.doFilter(req, res);
}

答案 1 :(得分:0)

有很多方法可以做到这一点。其中一个是使用javascript,例如JQuery。主要思想是无论脚本是否正在轮询服务器,如果用户在应用程序上没有活动(例如按键,鼠标移动等)一段合理的持续时间,则需要考虑用户不在场并且javascript需要为您的应用程序调用注销URL。请参考提供的URL,它实际上很好地解释了这个概念。

答案 2 :(得分:0)

这是更新的答案@BalusC。他的解决方案对我而言并不完全有效。试试这个解决方案。

@Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        int expireTimeInSeconds = 60;

        String skippableUrl = "/url";

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpSession session = request.getSession();

        int maxInactiveInterval = session.getMaxInactiveInterval();

        if (request.getRequestURI().equals(request.getContextPath() + skippableUrl )) {

            long lastAccessedTime = session.getLastAccessedTime();
            long currentTime = System.currentTimeMillis();
            int newMaxInactiveInterval = maxInactiveInterval - (int) ((currentTime - lastAccessedTime) / 1000);

            if (newMaxInactiveInterval <= 0 || maxInactiveInterval > expireTimeInSeconds) {
                session.invalidate();
            } else {
                session.setMaxInactiveInterval(newMaxInactiveInterval);
            }

        } else {
            session.setMaxInactiveInterval(expireTimeInSeconds);
        }

        filterChain.doFilter(servletRequest, servletResponse);
    }

答案 3 :(得分:-1)

在您的情况下,您需要会话管理方案,该方案将在N分钟时间内到期,无论用户是否保持活动状态。这样您就不需要通过任何身份验证或默认cookie。

您可以使用提议here的两种方法来实现它。

  1. 计划作业,在登录N分钟后使会话无效
  2. 基于标头和过滤器的方法,动态决定会话过期。