`
wxlgzxx_1988
  • 浏览: 66426 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Struts2 token 原理

阅读更多

token 拦截器用来解决表单重复提交的问题, 什么情况下会造成表单重复提交

典型的场景:

   配置
     <action name="tokenPrepare" class="org.apache.struts2.showcase.token.TokenAction" method="add">
            <result name="input">add.jsp</result>
        </action>
        <action name="transfer" class="org.apache.struts2.showcase.token.TokenAction">
            <result name="invalid.token">doublePost.jsp</result>
            <result type="redirect" name="success">list.jsp</result>
        </action>
   
   一个TokenAction处理了表单提交逻辑后dispatcher到一个list.jsp页面。 用户如果刷新list页面时会出现重复提交表单问题

   原因: struts2默认 dispatcher 为 内部重定向, 及 forward形式, 属于服务器端重定向

   解决方法:
   add.jsp表单内增加 <s:token/> 标记
   transfer增加 token拦截器
    <action name="transfer" class="org.apache.struts2.showcase.token.TokenAction">
            <interceptor-ref name="token"/>
            <result name="invalid.token">doublePost.jsp</result>
            <result name="success">list.jsp</result>
    </action>

   原理: 
         <s:token/> 使得访问add.jsp时会在session中设置一个struts.token值
         add.jsp表单中增加两个隐藏字段, 如:struts.token值随机生成
<input type="hidden" value="struts.token" name="struts.token.name">
<input type="hidden" value="FKZCDK5XC881W05MLVK0JQJP04M0KZC2" name="struts.token">
         提交表单到 transfer Action时先会经过token拦截器, token拦截器会从form表单中获取struts.token值, 再从session中获取
struts.token值, 比较两个值是否相同, 不相同, 直接返回 invalid.token(invalid.token应配置成重复提交表单的提示信息页面)
相同,remove掉session里的 struts.token值(防止被重复使用), 继续正常流程

    方法二:
       对于表单操作, 重定向方式改成redirect就不会造成重复提交表单了。
        <action name="transfer" class="org.apache.struts2.showcase.token.TokenAction">
            <result name="invalid.token">doublePost.jsp</result>
            <result type="redirect" name="success">list.jsp</result>
    </action>
分享到:
评论

相关推荐

    Struts拦截器及token拦截器防止重复提交例子源码

    Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的 拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器 三、定义Struts2拦截器。 ...

    Struts2 in action中文版

    1.3.3 Struts 2的工作原理 12 1.4 小结 14 第2章 初识Struts 2 16 2.1 声明性架构 16 2.1.1 两种配置 16 2.1.2 声明架构的两种方式 17 2.1.3 智能默认值 20 2.2 简单的HelloWorld示例 20 2.2.1 部署示例应用程序 20...

    Java中的Struts2框架拦截器之实例代码

    在看拦截器的小例子的前我们先来看看sturts2的原理   struts2自己是有拦截器的,通过拦截器可以拦截用户请求,并作出处理 拦截器作用有很多,譬如: 1.Action里面有个属性,这个属性我想在action执行之前改成别的值...

    李兴华Java Web开发实战经典(高清版) Part2

    15.4、Struts工作原理 15.5、深入Struts应用 15.6、本章摘要 15.7、开发实战讲解(基于Oracle数据库) 第16章 Struts常用标签库 16.1、Struts标签库简介 16.2、Bean标签 16.2.1、标签 16.2.2、标签 ...

    java web 视频、电子书、源码(李兴华老师出版)

    15.4、Struts工作原理 15.5、深入Struts应用 15.6、本章摘要 15.7、开发实战讲解(基于Oracle数据库) 第16章 Struts常用标签库 16.1、Struts标签库简介 16.2、Bean标签 16.2.1、标签 16.2.2、标签 ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    15.4、Struts工作原理 15.5、深入Struts应用 15.6、本章摘要 15.7、开发实战讲解(基于Oracle数据库) 第16章 Struts常用标签库 16.1、Struts标签库简介 16.2、Bean标签 16.2.1、标签 16.2.2、标签 16.2.3...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    15.4、Struts工作原理 15.5、深入Struts应用 15.6、本章摘要 15.7、开发实战讲解(基于Oracle数据库) 第16章 Struts常用标签库 16.1、Struts标签库简介 16.2、Bean标签 16.2.1、标签 16.2.2、标签 ...

    李兴华 java_web开发实战经典 源码 完整版收集共享

    15.4、Struts工作原理 15.5、深入Struts应用 15.6、本章摘要 15.7、开发实战讲解(基于Oracle数据库) 第16章 Struts常用标签库 16.1、Struts标签库简介 16.2、Bean标签 16.2.1、标签 16.2.2、标签 16.2.3...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 下

    15.4、Struts工作原理 15.5、深入Struts应用 15.6、本章摘要 15.7、开发实战讲解(基于Oracle数据库) 第16章 Struts常用标签库 16.1、Struts标签库简介 16.2、Bean标签 16.2.1、标签 16.2.2、标签 16.2.3...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    15.4、Struts工作原理 15.5、深入Struts应用 15.6、本章摘要 15.7、开发实战讲解(基于Oracle数据库) 第16章 Struts常用标签库 16.1、Struts标签库简介 16.2、Bean标签 16.2.1、标签 16.2.2、标签 ...

    李兴华 Java Web 开发实战经典 高清扫描版Part3

    15.4、Struts工作原理 15.5、深入Struts应用 15.6、本章摘要 15.7、开发实战讲解(基于Oracle数据库) 第16章 Struts常用标签库 16.1、Struts标签库简介 16.2、Bean标签 16.2.1、标签 16.2.2、标签 16.2.3...

    spring security 参考手册中文版

    37.5.2解析CsrfToken 272 第七部分 Spring数据集成 273 38. Spring Data&Spring安全配置 273 39. @Query中的安全表达式 273 第八部分 附录 274 40.安全数据库模式 274 40.1用户模式 274 40.1.1集团当局 274 40.2...

Global site tag (gtag.js) - Google Analytics