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

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

时间: 2024-12-31 10:00:43

Struts2 &amp;lt;s:token&amp;gt;防止表单重复提交 &amp;nbsp; %{}的相关文章

Struts2.0深入学习 命名空间,模型驱动,表单重复提交

Struts2深入探索: 1,package中的abstract="true"表示该package里面不能包函action元素 2,package中若指定namespace="/mynamespace"则: <!-- 包的namespace要以"/"开头,对应的页面的路径前面也加上/mymengya/ActionName.action 如:<s:form action="/mymengya/register.action&q

Struts2防止表单重复提交

最近开发中涉及到了表单重复提次的问题,通过研究做个总结.   防止表单重复提交主要用的到 标签: <s: token /> 拦截器: <interceptor-ref name="token" /> 默认的返回值: <result name="invalid.token">/input.jsp</result>   在页面加载时<s:token />产生一个GUID(Globally Unique Iden

Struts2框架学习之七:避免表单重复提交

前言 防止表单重复提交在web开发中是一个经常遇到的问题,一般来避免重复提交有两种方式:客户端JavaScript代码实现和服务端代码实现.这里主要介绍服务端的实现方式.在服务端实现表单重复提交的基本原理是:通过创建一个Session对象,并产生一个令牌值,将这个令牌值作为隐藏域随表单一起发送给客户端,同时在Session中保存令牌值.在用户提交表单的时候判断提交参数的令牌值与Session中的是否相等,如果相等则清除,不再使用这个令牌值,,然后执行后续的处理:如果两者不相等,表示已经提交过表单

struts2之防止表单重复提交

struts.xml配置文件 <?xml version="1.0" encoding="utf-8" ?><!doctype struts public "-//apache software foundation//dtd struts configuration 2.0//en" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts&

java Struts2防止表单重复提交代码

先要配置拦截器,拦截器用于控制重复提交内容!其实原理很简单,就是在表单内生成一个序列,判断是否为新的序列,如果是之前的序列,则证明是一个重复提交内容!  代码如下 复制代码 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&q

用Struts的Token机制解决表单重复提交

Struts的Token(令牌)机制能够很好的解决表单重复提交的问题,基本原理是:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配.在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换.这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生. 这时其实也就是两点,第一:你需要在请求中有这个令牌值,请求

PHP使用token防止表单重复提交的方法_php技巧

本文实例讲述了PHP使用token防止表单重复提交的方法.分享给大家供大家参考,具体如下: <?php /* * PHP使用token防止表单重复提交 * 此处理方法纯粹是为了给初学者参考 */ session_start(); function set_token() { $_SESSION['token'] = md5(microtime(true)); } function valid_token() { $return = $_REQUEST['token'] === $_SESSION

PHP生成token防止表单重复提交2个例子

在网上搜索了一下有很多站长都这样说的 1.提交按钮置disabled 当用户提交后,立即把按钮置为不可用状态.这种用js来实现. 提交前代码如下:  代码如下 复制代码 $("#submit").attr('disabled','true'); $("#submit").val("正在提交,请稍等"); 执行后,把按钮置为原来状态 代码如下:  代码如下 复制代码 $('#submit ').removeAttr('disabled'); $(&

浅谈Token安全及php表单加入Token防止重复提交

Token浅谈 Token,就是令牌,最大的特点就是随机性,不可预测.一般黑客或软件无法猜测出来. 那么,Token有什么作用?又是什么原理呢? Token一般用在两个地方--防止表单重复提交.anti csrf攻击(跨站点请求伪造). 两者在原理上都是通过session token来实现的.当客户端请求页面时,服务器会生成一个随机数Token,并且将Token放置到session当中,然后将Token发给客户端(一般通过构造hidden表单).下次客户端提交请求时,Token会随着表单一起提交