使用multipart / form-data表单的IE上的页面过期问题

时间:2014-01-23 19:33:47

标签: internet-explorer jsp file-upload back-button multipartform-data

如果我在表单标记中指定enctype="multipart/form-data",我在IE上会出现“Page Expired”问题。

通过简化,我有3个JSP页面page1.jsppage2.jsppage3.jsp

page1.jsp(其中包含enctype="multipart/form-data"的表单)提交page2.jsppage2.jsp提交page3.jsp

如果我:

  1. 提交至page2.jsp
  2. 再次从page2.jsp提交到page3.jsp
  3. 从page3.jsp返回到page2.jsp(使用history.back()javascript),我得到“Page Expired”。
  4. 我读过有关缓存控制的内容,但是设置这些页面时缓存控制为私有或公共不会改变情况

    // page1.jsp
    <%@ page language="java" contentType="text/html;charset=UTF-8"%>
    <html>
    <head>
    </head>
    <body>
       <form method="post" enctype="multipart/form-data" action="page2.jsp">
    File to upload: <input type=file name=upfile>
    <input type=submit value="Go to page2"> 
    </form> 
    

     // page2.jsp
    <html>
    <head>  
    </head>
    <body>
       <form method="post" action="page3.jsp">            
       <input type=submit value="Go to page3"> 
       </form> 
     </body>
    </html>
    
    
    // page3.jsp
    <html>
    <head>
    </head>
    <body>
        <form method="post" action="end.jsp">
        <input type="button" value="Go to page 2" onclick="javascript:history.back();"> 
        <input type=submit value="Go to end">        
        </form>
    </body>
    </html> 
    

3 个答案:

答案 0 :(得分:0)

您没有在第2页上找到表单,而是单击转到第3页,您应该使用

<%
  response.sendRedirect("page3.jsp");
  return;
%>
上传处理完成后,在JSP中的第2页

当您从第3页返回第2页时,您将收到“页面已过期”消息,您不应该这样做,也不允许这样做。如果page2是处理文件上传的代码,则必须从那里进行重定向,这将阻止能够使用后退按钮返回到第2页。

你为什么要这样做?因为在服务器上执行更新操作的页面(数据库更新,文件上载处理)应始终重定向到另一页以防止后退双按钮提交或刷新双重提交问题。 (执行重定向意味着,后退按钮将返回到第1页而不是第2页。历史记录中将跳过第2页。)

浏览器本身通过使上传处理页面过期来为您提供一定程度的防止双文件上传的保护,但您不应该依赖它,因为浏览器不会对正常的表单提交执行此操作,仅用于文件上载(即multipart / form-data)。

答案 1 :(得分:0)

基本上你得到的是正确的。当您返回到page2时,数据将被重新提交,因为这不会发生,页面将显示为已过期。您可以使用其他一些浏览器(如Firefox或Google Chrome)检查此行为,它会询问您是否要重新提交数据。

如果你想在page3之后到达page2,你需要从page3重定向到page2而不是使用历史记录动作返回。

答案 2 :(得分:0)

只需使用post-redirect-get范例:

  1. page1 - post - &gt; servlet1
  2. servlet1 - 处理数据然后重定向 - &gt;第2页
  3. 第2页 - 发布 - &gt; servlet2
  4. servlet2 - 处理数据然后重定向 - &gt;第3页
  5. 通过这种方式,浏览器不会要求重新提交或在后退时显示“页面已过期”

    但是你可以减少以这种方式实现的页面/ servlet的数量:

    page2.jsp

    <% 
        if("POST".equals(request.getMethod()) 
        {
            // process submitted params/files
            response.sendRedirect(request.getRequestURI()); // redirect to the same page
        }
    %>
    <html>
        blah blah blah
    </html>
    

    或者你可以简单地使用ajax。