2016-09-19 170 views
1

我在我的应用程序中轮询每5分钟执行一次的HTTP请求。HTTP会话:如何配置不会更改会话过期的URL?

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

怎么可能做到这一点?

新增

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

澄清(新增2)

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

+0

不要将JSESSIONID(删除或设置为别的东西)这个请求,让服务器认为它的一个新的请求。 –

+0

该请求应通过认证 – Michael

+0

jsessionid是服务器用于识别会话的依据。你能否使用其他标识符来获取用户信息,如不同的cookie,并从这些请求中删除jsessionid? –

回答

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); 
} 
+0

过滤器是否可以从web.xml中读取会话超时值? ' 5 ' – Michael

+1

@Michael:也不是标准的API:http://stackoverflow.com/q/17528373替代方法是记住在会话中首先调用'getMaxInactiveInterval()'。 – BalusC

-1

在您的情况下,您需要一个会话管理方案,该方案在N分钟时间内过期,而不管用户是否保持活动状态。这样你就不需要通过任何认证或默认的cookies。

您可以通过两种方法实现它提出here

  1. 预定作业从登录
  2. 标头,并且基于过滤器的方法N分钟后会话无效来动态决定会话到期。
+0

这不是我所需要的。我不希望会话将会过期,无论用户是否保持活动状态。我希望会话将在用户不活动时过期,并且如果用户在UI上工作,则不会过期。我希望会话将在用户不活动时终止,尽管每5分钟会有一次轮询请求 – Michael

0

有许多方法来这样做。其中之一是使用javascript例如JQuery。主要思想是,不管脚本是否轮询服务器,如果用户没有对应用程序进行任何活动,例如在合理的持续时间内按下按键,鼠标移动等,则需要考虑用户不在场且javascript需要调用您的应用程序的注销url。请参考提供的网址,它可以很好地解释这个概念。

+0

插件如何区分由用户活动(例如按键,鼠标移动等引起的请求)和池请求? – Michael

+0

用户活动通常建模为可以处理的JS引擎的事件,另一方面的投票是从引擎内执行的活动,例如, Angular等中的$ http调用,框架可以跟踪事件,并且在指定的时间段内没有任何事件可以被解释为无用户活动 – Ironluca

+0

由于一个轮询请求,我无法更改现有UI。正如我在问题中所说的,我需要配置池化URL – Michael