精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-06-18
最后修改:2012-06-18
|
|
返回顶楼 | |
发表时间:2012-06-18
17.2.1 使用<s:token/>标签入门Token也被称做令牌,所以使用<s:token/>标签防止重复提交,也常被称做使用令牌防止重复提交。 1:修改页面 <s:token/>标签的使用非常简单,只需要在提交页面的<s:form>标签内加上子标签<s:token/>就可以了。 如果把提交页面当做重复提交时返回的结果页面的话,通常还需要在这个页面上引用重复提交时的错误信息。重复提交的错误信息以动作错误信息的方式存在,所以我们只要用<s:actionerror/>标签来引用即可。示例代码如下:
java代码:
2:修改struts.xml 使用<s:token/>标签,必须为Action引用名为token的预定义拦截器,它并不在defaultStack拦截器栈里,所以需要手动的引用token拦截器。 如果有重复提交的行为,Struts2将跳转到这个Action定义的名为invalid.token的Result,因此,需要修改struts.xml,示例代码如下:
java代码:
我们并没有修改TokenAction。那么,现在再次访问订单提交页面,且再次两次提交,可以看到页面跳转到invalid.token指定的Result,其实就是原来的提交页面,并输出重复提交的提示信息,如图所示: 图17.1 页面被重定向到指定的invalid.token结果 再看看控制台的输出,应该只有一次输出了,示例如下:
java代码:
可以看到,重复的订单数据只被处理了一次,已经正确的处理了重复提交的问题。但是,还有一个小小的遗憾:页面停到了第二次提交被重定向到invalid.token结果上,而不能正确的走到第一次提交的success结果上。 17.2.2 <s:token/>的原理为什么简简单单的引用<s:token/>标签,就能够实现防止重复提交的功能呢? 下面来探究一下<s:token/>的运行原理,对于<s:token/>标签和token拦截器的两部分作用要分开来看:
来把上面的两件事情画成流程图,估计比枯燥的文字更容易让人理解。如下图所示: 图16.2 使用令牌防止重复提交流程图 也许,有些朋友会说,既然struts.token隐藏域记录的值和session的struts.token属性记录的值一模一样,那么,在token拦截器运行的时候,比较的结果还可能不相等吗? 当然是可能的,因为token拦截器的作用在重复提交的时候才能显现出来。一起来分析分析,按照运行顺序,先后发生了如下的几件事情:
补充说明:如果指定了<s:token/>标签的name属性,那么对session写入的属性名就不再是默认的struts.token,而是这个name值;同理对表单写入的隐藏域名也不再是默认的struts.token,也是这个name值了。在理解<s:token/>标签和token拦截器的作用时,基本不用理会struts.token.name隐藏域的作用。
私塾在线网站原创《研磨struts2》系列 转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4150.html】 欢迎访问http://sishuok.com获取更多内容 |
|
返回顶楼 | |
发表时间:2012-06-18
|
|
返回顶楼 | |
发表时间:2012-06-18
判断重复提交的地方有加锁吧??
|
|
返回顶楼 | |
浏览 3127 次