2012-05-05 36 views
3

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

谢谢。

回答

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> 
+0

感谢(+1),它看起来可能会工作。我将等待一段时间,看看是否有任何其他答案... – a1ex07

+0

我没有看到任何更简单的方式在Tomcat上。您需要对Tomcat的内部进行一些非常有创意的更改,以允许请求访问会话对象而不更新上次访问的时间。 –

0

我会创建一个单独的Web应用程序(沿着你现在的一侧)采取AJAX调用。 在这第二个网络应用程序中,您可以避免创建会话。您可以通过在JSP的页面中使用session =“false”来完成此操作,或者只是不在Servlet中明确创建一个。如果您需要在这两个应用程序之间共享数据,那么您可以在Context定义中使用属性crossContext =“true”。 Tomcat Docs

+0

谢谢您的回答,但它不是(至少在目前)我的选择。我必须使用相当老的系统,而重构可能需要很长时间。另外,我需要处理程序中的会话数据,我只是不想更新会话(如果会话过期,处理程序返回不同的结果) – a1ex07

+0

因此,您只是想为AJAX处理程序编写代码?没有其他的 ? – rickz

+1

是的。但问题是,处理程序应该有权访问会话数据,而不会延长会话生存期 – a1ex07