Struts2 <s:token>防止表单重复提交   %{}

简介: token是为了防止表单重复提交,token 原理大致为:1:显示表单的那个 action 中使用 createToken() 生成一个随机的 token值,并存放在服务端(session或者cache中),并且传递一份到页面中2:表单页面使用一个隐藏表单域获取后端传过来的 token值,该表单页面提交时会将此 token 值一同提交到后端3:在表单页面提交到的 actioin 中使用

token是为了防止表单重复提交,token 原理大致为:

1:显示表单的那个 action 中使用 createToken() 生成一个随机的 token值,并存放在服务端(session或者cache中),并且传递一份到页面中

2:表单页面使用一个隐藏表单域获取后端传过来的 token值,该表单页面提交时会将此 token 值一同提交到后端

3:在表单页面提交到的 actioin 中使用 validateToken() 将服务端与表单隐藏域中的 token 值进行对比,如果服务端存在 token值并且与表单提交过来的值相等,证明是第一次提交。

4:每次校验过后服务端的 token 值会立即被清除,所以当用户重复提交时,后面的提交校验都再也无法通过。从而实现了防止重复提交的功能,validateToken 是在 synchronized 块中执行的保障了多线程下的安全性。

    token 会优先存入 me.setTokenCache(ITokenCache) 指定的 TokenCache 中,如果未指定则默认使用 session 来存放




Struts2的标签都支持动态数据的访问,标签的属性都可以使用OGNL表达式。Struts2标签的属性具有类型,这些类型可以简单地分为字符串类型和非字符串类型,对于字符串类型的属性,如果要访问动态数据,需要使用%{…}这样的语法。例如:
<s:include value=”%{url}”/>  

include标签的value属性民是字符串类型,Struts2将对这个属性进行解析,如果属性值使用%{…}包含,那么%{…}中的内容将被视为OGNL表达式。如果属性中没有使用%{…},那么属性值将被直接看成是字符串数据。例如:
<s:include value=”urlTag.action”/>  

对于非字符串类型的属性值,将直接作为OGNL表达式进行求值。例如:
<s:property value=”username”/>  

property标签的value属性是Object类型,它的值username将作为OGNL表达式进行求值,结果是值栈中位于栈顶的对象的username属性的值。如果要为非字符串类型的属性直接指定字符串数据,那么需要使用OGNL中的字符串常量,即用单引号或双引用将字符串括起来。例如:
<s:property value=”’zhangSan’”/>  

在property标签的value属性中,也可以使用%{…}。不过使用%{…}与不使用没有什么区别。Struts2会忽略%{…}的存在,把内容以OGNL表达式来处理。
<s:property value=”%{’zhangSan’}”/>  

对property标签的value属性来说,%{‘zhangSan’}与’zhangSan’是相同的。因为value属性的类型是Object,所以value属性的内容直接被作为OGNL表达式处理。但Struts2不会因为加了%{…}而报错,而是忽略掉%{…}的存在,直接把内容取出做为OGNL表达式处理。
总结一下,Struts2标签的属性按照下列三个规则进行计算:
所有的字符串属性类型都会解析%{…}这样的语法。将%{…}内容做为OGNL表达式处理。
所有的非字符串属性类型都不会被解析,而是直接被看作一个OGNL表达式进行求值。
对于第二个规则的例外情况是,如果非字符串属性中使用了%{…}语法,那么%{…}将被忽略,花括号中的内容将作为OGNL表达式被计算。

当我们使用标签时,忘记了某个属性是字符串类型,还是非字符串类型,那么有一个冬的方法,那就是不考虑它是什么类型,统一使用%{…}语法。


参考文章:

http://www.cnblogs.com/iyangyuan/archive/2013/05/05/3060488.html


本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1744443

目录
相关文章
|
开发者 Python
__init__&amp;__del__&amp;__str__&amp;__repr__&amp;__call__魔法介绍 | 学习笔记
快速学习__init__&amp;__del__&amp;__str__&amp;__repr__&amp;__call__魔法介绍
__init__&amp;__del__&amp;__str__&amp;__repr__&amp;__call__魔法介绍 | 学习笔记
使用jMeter的regular expression extract提取SSO form的XSRF protection token
使用jMeter的regular expression extract提取SSO form的XSRF protection token
128 0
使用jMeter的regular expression extract提取SSO form的XSRF protection token
|
Apache
OSX&amp;nbsp;10.8+下开启Web&amp;nbsp;共享&amp;nbsp;的方法
MENU Home Archives About SUBSCRIBE MENU OSX 10.8+ Mountain Lion 下开启 Web Sharing(Web 共享)的方法 JUL 28, 2012 #OS X #how...
1259 0
|
Ruby
rails设置表单默认值&amp;&amp;隐藏表单
需求: 用户没有登录时游客评论,需要游客输入用户名和评论内容;当用户已登录时,读取session获取用户名,隐藏输入用户名的表达,用户直接发表评论。
751 0
Category&amp;nbsp;Protocol&amp;nbsp;Exte…
作者:韩俊强 总结以往方法: 继承是可以完成对类型的扩充,不仅能添加方法,也可以添加实例变量;/缺点:如果工程中有很多需要扩充类的使用,此时要用子类去完成替换,工作量非常大,还容易出错。下面通过例子过渡一下进入类的扩展! ==============================================================  1.
707 0
|
iOS开发
UIEvent&amp;nbsp;UIResponder&amp;nbsp;UI_04
1、事件(UIEvent),是由硬件设备捕捉到用户对设备的操作,把这个操作抽象成一个事件对象     ios中三大事件:触Touches摸晃动事件Motion,远程控制事件RemoteControl;其中应有最广泛的是触摸事件 UIView是支持触摸的,由于UIView 内部没...
620 0
|
存储
DesignModeler&amp;nbsp;GestureRecgin…
DesignModeler : 设计模式     GestureRecginzer:手势识别 作者:韩俊强 原创版权地址:http://blog.sina.com.cn/s/blog_814ecfa90102vvm5.
852 0
|
索引
TableEdit&amp;nbsp;UI_10
1、tableView的编辑的步骤:  1.让tableView处于编辑状态,(默认所有的cell都处于编辑状态,默认下的编辑样式是删除)  2.设置哪些cell可以编辑  3.设置编辑的样式(删除,插入)  4.
737 0
UITableViewBase&amp;nbsp;UI_09
1、UITableView API文档总结:      1.UITableView的父类时,UIScrollView,所以它是可以滚动的,但是只能在竖直方向滚动.      2.UITableView是iOS中提供的用来以列表的形式展示数据,但是只有一列.
979 0
Cookie &amp; Session &amp; CSRF
新blog地址:http://hengyunabc.github.io/cookie-and-session-and-csrf/ 在线幻灯片地址: Cookie & Session & CSRF ...
1074 0