我在我的应用程序中轮询每5分钟执行一次的HTTP请求。
我想配置这些网址,以免更改会话过期。 否则我的会话永远不会过期(我不想要它)。 无法在web.xml和HttpSession文档中找到它。
怎么可能这样做?
加
非常重要的澄清:请求应该通过身份验证。 这意味着请求应附加到已经过身份验证的JsessionID。
澄清(已添加2)
无论用户是否保持活动状态,我都不希望会话过期。我希望会话将在用户不活动时到期,如果用户在UI上工作,则不会过期。我希望会话将在用户不活动时到期,尽管每5分钟有一次轮询请求
答案 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的两种方法来实现它。