u010511715 2009-06-25 10:03
浏览 293
已采纳

Struts 2文件重复上传问题

在页面a有个链接,点击该链接后进入页面b,页面b的代码如下:


/s:submit
/s:form

在页面b选择文件后,点击“发送”,程序进入action internalMailSave, internalMailSave代码如下:
public class InternalMailSaveAction extends ActionSupport {
private File upload;
(其它代码省率)
}

internalMailSave完成之后返回页面a. 现在的问题是:当再次点击链接进入页面b后,不选择任何文件,直接点击“发送”,发现之前上传的文件会再次上传一次。在debug模式下也发现第二次进入internalMailSave时upload不为null,其值跟第一次上传时一样。

  • 写回答

4条回答 默认 最新

  • wanghaolovezlq 2009-06-25 12:01
    关注

    struts2避免重复提交

    struts2使用拦截器来检查表单是否重复提交,它采用同步令牌的方式来实现对表单重复提交的判断。

    首先需要在表单中使用/s:token

    标签创建一个新的令牌值,并用你所指定的令牌名把令牌保存到session中。而这个令牌值是随即产生的经过加密的字符序列,不会重复。

    其次需要为action配置TokenInterceptor或者TokenSessionStoreInterceptor拦截器。这两个拦截器都已经在struts-default.xml中定义,但没有包含在defaultStack拦截器栈中。

    在action中配置拦截器和在重复提交时,将要请求导向的结果视图。

      <!-- 配置异常映射,当RegisterAction抛出Exception异常时,向用户显示error.jsp页面 -->
    
      <exception-mapping result="error" exception="java.lang.Exception"/>
    

    /WEB-INF/pages/register.jsp

      <result name="input">/WEB-INF/pages/register.jsp</result>
    
      <result name="success">/WEB-INF/pages/success.jsp</result>
    
      <result name="error">/WEB-INF/pages/error.jsp</result> 
    
      <interceptor-ref name="defaultStack">
    
      <param name="workflow.excludeMethods">default</param>
    
      </interceptor-ref>
    
      <interceptor-ref name="token">
    
         <param name="excludeMethods">default</param>
    
      </interceptor-ref>
    
    </action>
    

    注:excludeMethods指定要排除的方法。

    在register.jsp页面中添加action级别的错误信息显示的标签:

    在form中添加标签:/s:token

    最好为在资源文件中设置键struts.messages.invalid.token的本地化消息。

    struts.messages.invalid.token=您已经提交了表单,请不要重复提交。

    TokenSessionStoreInterceptor:使用TokenSessionStoreInterceptor拦截器同样能避免重复提交,TokenSessionStoreInterceptor集成自TokenInterceptor。使用TokenSessionStoreInterceptor将不会输出任何错误信息。如果token无效,请求被导向到invalid.token结果码映射的视图。

    配置如下:

         <param name="excludeMethods">default</param>
    
      </interceptor-ref>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 关于#python#的问题:自动化测试