Internet explorer 带有多部分/表单数据表单的IE页面过期问题

Internet explorer 带有多部分/表单数据表单的IE页面过期问题,internet-explorer,jsp,file-upload,back-button,multipartform-data,Internet Explorer,Jsp,File Upload,Back Button,Multipartform Data,如果我在表单标签中指定enctype=“multipart/form data”,IE上就会出现“页面过期”问题 通过简化,我有3个JSP页面page1.JSP,page2.JSP和page3.JSP page1.jsp(其中包含带有enctype=“multipart/form data”)的表单)提交到page2.jsp,而page2.jsp提交到page3.jsp 如果我: 提交到page2.jsp 再次从page2.jsp提交到page3.jsp 从page3.jsp返回到page2.j

如果我在表单标签中指定
enctype=“multipart/form data”
,IE上就会出现“页面过期”问题

通过简化,我有3个JSP页面
page1.JSP
page2.JSP
page3.JSP

page1.jsp
(其中包含带有
enctype=“multipart/form data”
)的表单)提交到
page2.jsp
,而
page2.jsp
提交到
page3.jsp

如果我:

  • 提交到page2.jsp
  • 再次从page2.jsp提交到page3.jsp
  • 从page3.jsp返回到page2.jsp(使用history.back()javascript),我得到“页面已过期”
  • 我读过有关缓存控制的内容,但将这些页面设置为“缓存控制私有”或“公共”并不能改变这种情况

    // 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> 
    
    //page1.jsp
    要上载的文件:
    

    //page2.jsp
    //页面3.jsp
    
    您应该使用

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

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

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


    通过使上载处理页面过期,浏览器本身为您提供了一定程度的保护,以防止双重文件上载,但您不应该依赖于此,因为浏览器不会对正常表单提交执行此操作,仅对文件上载(即多部分/表单数据)执行此操作

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


    如果您想在第3页之后进入第2页,则需要从第3页重定向到第2页,而不是使用历史记录操作返回。

    只需使用后重定向获取范例:

  • 第1页--post-->服务1
  • servlet1--处理数据然后重定向-->第2页
  • 第2页--post-->服务2
  • servlet2--处理数据然后重定向-->第3页
  • 通过这种方式,浏览器将不会要求重新提交,也不会在背面显示“页面已过期”

    但是,您可以通过以下方式减少页面/servlet的数量:

    页面2.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。

    首先,文件上传在第1页。这里,我在简化:在第1页,我有一个带有一些字段(和文件上传)的表单,在第2页,我有另一个带有一些字段(没有文件上传)的表单,在第3页,我有一个用户数据输入的摘要,当用户提交第3页表单时,执行插入并重定向到另一页,以防止表单重新提交,您需要在处理上载的页面上执行服务器端重定向,因此您需要3个以上的页面,然后,您需要4个(或更多)“首先,文件上载在第1页”您的意思是表单在第1页,但其处理在第2页,对吗?这就是问题所在。处理上载后,Page2需要执行服务器端重定向。是。当用户在第1页提交表单时,servlet将文件加载到临时目录中,并显示第2页。然后用户在第2页提交表单,调用第二个servlet并显示第3页。问题出现在从第3页到第2页(仅在IE上),Firefox和Chrome不会出现这种情况。此外,如果没有第1页上的文件上传,IE上也不会出现这种情况。
    <% 
        if("POST".equals(request.getMethod()) 
        {
            // process submitted params/files
            response.sendRedirect(request.getRequestURI()); // redirect to the same page
        }
    %>
    <html>
        blah blah blah
    </html>