3

如何在 Tomcat 5.5 中针对特定请求禁用重置会话超时?在一个页面上,我有一个 javascript 函数,它定期向服务器发送 ajax 调用。在服务器端,我不希望这些调用更新会话生命周期。

谢谢你。

4

2 回答 2

3

好的,既然你不喜欢我的第一个想法,我想出了这个 JSP 演示。这是一种黑客攻击,但它确实有效。要测试,复制和粘贴。浏览到第一个 JSP。它将启动一个会话并设置非活动间隔。重定向后,继续点击浏览器上的刷新按钮。无论您请求第二个 JSP 多少次,当前会话都会终止。

test1.jsp

<%
   session.setMaxInactiveInterval(20); //for easy testing
   response.sendRedirect("test2.jsp");
%>

test2.jsp

<%@ page session="false" import="java.util.*" %>
<%
  HttpSession session = request.getSession(false);
  if(session == null){
                  out.print("Error, No Session!");
                  return;
  }
  long creationTime = session.getCreationTime();
  long now = new Date().getTime();
  long lastAccessedTime = session.getLastAccessedTime();
  int oldInterval = session.getMaxInactiveInterval();
  int inactivePeriod = (int)(now - lastAccessedTime)/1000; 
  session.setMaxInactiveInterval(oldInterval - inactivePeriod); 
  int newInterval = session.getMaxInactiveInterval();
%>
<html>
<body>
session id is <%=session.getId()%>
<br/><%=creationTime%> = creationTime
<br/><%=lastAccessedTime%> = lastAccessedTime
<br/><%=now%> = now
<br/><%=oldInterval%> = oldInterval in seconds 
<br/><%=inactivePeriod%> = inactivePeriod
<br/><%=newInterval%> = newInterval in seconds 
</body>
</html>
于 2012-05-05T18:22:01.890 回答
0

我会创建一个单独的网络应用程序(与您现在的应用程序一起)来接受 AJAX 调用。在第二个 Web 应用程序中,您可以避免创建会话。您可以通过在 JSP 的页面指令中使用 session="false" 或在 Servlet 中不显式创建指令来做到这一点。如果您需要在这两个应用程序之间共享数据,则可以在上下文定义中使用属性 crossContext="true"。 Tomcat 文档

于 2012-05-05T16:25:01.387 回答