zoukankan      html  css  js  c++  java
  • Struts2中解决表单重复提交

    3. 表单的重复提交问题

    1). 什么是表单的重复提交

    > 在不刷新表单页面的前提下: 
    >> 多次点击提交按钮
    >> 已经提交成功, 按 "回退" 之后, 再点击 "提交按钮".
    >> 在控制器响应页面的形式为转发情况下,若已经提交成功, 然后点击 "刷新(F5)"

    > 注意:
    >> 若刷新表单页面, 再提交表单不算重复提交
    >> 若使用的是 redirect 的响应类型, 已经提交成功后, 再点击 "刷新", 不是表单的重复提交

    2). 表单重复提交的危害:

    3). Struts2 解决表单的重复提交问题:

    I. 在 s:form 中添加 s:token 子标签

    > 自动生成一个隐藏域,并且自动生成一个值
    > 自动在 session 添加一个属性值
    > 隐藏域的值和 session 的属性值是一致的.

    II. 使用 Token 或 TokenSession 拦截器.

    > 这两个拦截器均不在默认的拦截器栈中, 所以需要手工配置一下
    > 若使用 Token 拦截器, 则需要配置一个 token.valid 的 result

    <action name="testToken" class="com.atguigu.struts2.token.app.TokenAction">
                <interceptor-ref name="Token"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <result>/success.jsp</result>
                <result name="invalid.token">/token-error.jsp</result>
            </action>

    > 若使用 TokenSession 拦截器, 则不需要配置任何其它的 result,一般推荐使用这个

    使用这个这TokenSession拦截器需要在struts.xml文件中配置:

    <action name="testToken" class="com.atguigu.struts2.token.app.TokenAction">
                <interceptor-ref name="tokenSession"></interceptor-ref>//这种方式就是可以按我们需要去调用拦截器,因为有些拦截在默认拦截器栈中并不存在,所以我                     //们要手工调用,以后咋们如果需要用到其他拦截器也可以在这里手工配置,这样就会先调用我们配置的拦截器,然后才调用默认的拦截器
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <result>/success.jsp</result>
                
            </action>

    III. Token VS TokenSession

    > 都是解决表单重复提交问题的
    > 使用 token 拦截器会转到 token.valid 这个 result
    > 使用 tokenSession 拦截器则还会响应那个目标页面, 但不会执行 tokenSession 的后续拦截器. 就像什么都没发生过一样!

    IV. 可以使用 s:actionerror 标签来显示重复提交的错误消息.
    该错误消息可以在国际化资源文件中覆盖. 该消息可以在 struts-messages.properties 文件中找到

    struts.messages.invalid.token=^^The form has already been processed or no token was supplied, please try again.

     注意国际化文件定义的东西为什么会被自动获取呢????

    所以表单重复提交解决流程简单如下:

    1添加s:token标签

    2配置Token和tokenSession拦截器

    就这么简单,一般优先使用tokenSession拦截器,因为我只是表单重复提交而已,没必要提示错误消息,只要服务器不进行处理就好了 ,

  • 相关阅读:
    保持URL不变和数字验证
    centOS ftp key?
    本地环境测试二级域名
    linux 解决You don't have permission to access 问题
    php smarty section loop
    php header Cannot modify header information headers already sent by ... 解决办法
    linux部分命令
    Linux 里面的文件操作权限说明
    用IT网络和安全专业人士视角来裁剪云的定义
    SQL Server 2008 R2炫酷报表"智"作有方
  • 原文地址:https://www.cnblogs.com/jeremy-blog/p/3995505.html
Copyright © 2011-2022 走看看