【问题标题】:Session expired on form submit提交表单时会话过期
【发布时间】:2012-03-13 18:48:57
【问题描述】:

有一种情况,我有一个表单,它从我的应用程序中显示为各种事件的动态弹出窗口。我正在填写表格并提交它,这会导致会话过期。

我发现在表单中打印请求标头的值时,我看到 jsession id 丢失或者有时会创建新的 jseesion id。

这种情况并不经常发生。在工作情况下,我不会丢失任何 jsession id 或得到不同的 jseesion id。

有什么建议吗?

下面是代码示例。

<HTML>
 <HEAD>
  </HEAD>
   <%
  Enumeration<String> headerNames = request.getHeaderNames(); 
 while (headerNames.hasMoreElements())
 { 
    String headerName = headerNames.nextElement();
  String headerValue = request.getHeader(headerName);
   System.out.println("Header Name   " +headerName );
  System.out.println("headerValue   " +headerValue );
 } 
 %>
 <body>
 Comments </br>
<form name = 'savefrm' action ='save.jsp'>
<textarea name = 'comments' id = 'text' cols=38 rows=8>"+comments.trim()+"</textarea>
<input type="submit" value="ok"/>
</form>
 </body>
 </html>

【问题讨论】:

  • 这是一个单独的 servlet 还是应用程序中的一个?
  • 没有应用程序的内置 servlet。
  • 您必须首先排除这是服务器问题还是客户端问题。要确定它,您需要跟踪 HTTP 流量。在 Chrome/IE9/Firebug 中,您可以按 F12 检查“网络”流量。检查请求/响应标头。如有必要,请尝试不同的浏览器以查看行为是否相同。如果确实是服务器返回了一个新的 JSESSIONID cookie 作为响应,即使客户端已经在请求中发送了正确的 JSESSIONID cookie,那么这是服务器问题,否则是客户端问题。

标签: html jsp session servlets


【解决方案1】:

您应该像这样通过 web.config 设置会话超时:

<configuration>
  <system.web>
     <sessionState timeout="100000"></sessionState>
  </system.web>
 </configuration>

1000 毫秒 = 1 秒

【讨论】:

  • 我们以编程方式将其设置为 session.setMaxInactiveInterval(-1);
  • 会话空闲时不会发生这种情况。
  • 抱歉,这是针对 .Net 环境的。对于 Servlet,您应该尝试我的第二个答案。
【解决方案2】:

关于 web.xml 文件:

<web-app>
    <session-config>
        <session-timeout>20</session-timeout>
   </session-config>
</web-app>

20 = 20 分钟

或者你可以在代码里面做:

HttpSession session = request.getSession();
session.setMaxInactiveInterval(20*60);

20 * 60 = 20 分钟

【讨论】:

  • 会话空闲时不会发生这种情况,我们以编程方式将其设置为 session.setMaxInactiveInterval(-1);
  • 为什么将它设置为 -1 ?此步骤将终止会话。您正在做的是尝试将超时更改为-1。因此,您的会话会立即被终止。
猜你喜欢
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 2017-07-22
  • 2012-04-11
相关资源
最近更新 更多