最近在项目中使用到struts2的token防重提交方法,但出现很多问题:
在有防重页面填写资料时,不小心打开另一个有防重页面后(同一浏览器),填写资料的页面不能提交,后台提示tokenId 与sessionId不匹配,通过调试,发现tokenId在新打开页面时,发生了改变,目前还未找到解决方法解决这种情况。
如下是在网上找了一些原理性的东西,记录于此。
来源:http://www.cnblogs.com/iyangyuan/archive/2013/05/05/3060488.html
小菜最近接触了struts2中的令牌知识,由于该知识点比较重要,因此想弄明白些,于是满怀信心的上网查阅资料,结果让小菜很无奈,网上的资料千篇一律,总结出来就一句话:“访问页面时,在页面产生一个token id,同时在服务器的session中保存一个同样的id,提交时判断如果相同怎么样不相同怎么样。。。”
可能是小菜愚笨,实在是无法从这么精炼的描述中体会令牌的精髓。
肤浅的那么一说,然后上来就是一堆代码,有时候对初学者的帮助可能不是很大,如果能够介绍一下其中的原理,无疑会加快读者学习速度。
经过刻苦的研究,下面小菜来介绍一下,令牌究竟是如何做到防止界面刷新的。
本文不涉及令牌具体用法,只讲原理。
首先需要说明的是,在struts2框架中使用令牌基本上就是两步:
l 在jsp页面中使用<s:token></s:token>标签,可以放在表单中任何位置,这个标签的作用就是在页面中产生一个token id,可以通过“查看源文件”的形式看到。为什么要放在表单中呢?因为这个是要提交到服务器的,要不然服务器怎么知道你的id是多少?
l 在struts2核心配置文件中为token拦截器添加参数,来指明需要拦截哪些方法,例如:<interceptor-ref name="token"><param name="includeMethods">save</param></interceptor-ref>,指明拦截save方法。当然也可以用excludeMethods来声明不拦截哪些方法。
令牌生成原理图:
从图中可以看出,如果某个jsp页面中有token标签,那么无论是请求这个界面还是内部转发到这个界面,我们统一说成是“渲染界面”的时候,都会造成token id的产生或者更新。
一定要搞清楚,这里是请求的jsp页面,此时可以产生令牌,但令牌不会起作用,因为它拦截的不是jsp,而是通过反射机制调用的方法。
令牌拦截原理图:
从图中可以看出,令牌可以拦截的是Action中的方法。
如果方法需要被拦截,会判断session中的token id和提交过来的token id是否相等。如果不相等,则直接跳转到预先配置好的界面,session中的token id不变;如果相等,则执行请求的方法,关键的一点是,此时session中的token id会被清空!这个步骤非常关键!
综上,关于令牌的使用,记住以下几点,基本可以应对各种复杂的令牌应用场景
l 注意令牌的产生时机,它是在加载(或渲染)带有token标签的jsp页面时产生的,与请求或者转发无关,与方法是否被拦截无关。
l 由于服务器端的token id是保存在session中的,因此不同的页面间可以共享,使用时注意,避免混乱。
l 如果访问的方法属于被拦截的方法,验证通过之后,会清空session中的token id;如果验证不通过,session 中的token id不变,直到下一次加载(或渲染)带有token标签的jsp页面。
再多啰嗦一些,为什么验证通过后要清空session中的token id呢?其实不难理解,从宏观上来思考,重复提交有一个必然的特征:它的token id是上一个。因此只要保证验证通过后session中保存的token id变化即可,清空是最直接的办法。要想通过验证,只有一个途径:重新加载(或渲染)带有token标签的jsp页面,使客户端的token id和服务器端的token id一致。
相关推荐
在你提供的压缩包文件"token"中,可能包含了一个简单的Struts2令牌实例,你可以通过查看源代码学习如何在实际项目中集成和使用令牌机制。学习和理解这个实例,将有助于你更好地理解和应用Struts2的令牌功能。
本文将深入探讨Struts2令牌的工作原理、配置方法以及实际应用场景。 #### 二、Struts2令牌的实现原理 ##### 1. 令牌的生成与存储 当用户首次访问需要进行表单操作的页面时,Struts2会在用户的会话中生成一个唯一的...
在处理表单提交时,为了防止重复提交或者跨站请求伪造(CSRF)攻击,Struts2引入了令牌机制。这个"struts2 令牌使用例子"是一个很好的实践教程,帮助开发者理解如何在实际应用中实施这一安全策略。 首先,我们需要...
在Struts框架中,令牌机制(Token)是一种防止重复提交的有效方法,它主要用于处理表单数据的并发控制,防止用户意外或者恶意地多次提交表单,从而确保数据的一致性和安全性。 在Web应用中,用户可能会因为网络延迟...
Struts2提供了一种名为“token”的机制来解决这个问题。 **什么是Token机制?** Token机制是一种防止重复提交的方法,它通过在客户端(通常是浏览器的session或者cookie)和服务器端存储一个唯一的令牌,确保每个...
Struts2的令牌机制是其防止重复提交和CSRF(跨站请求伪造)攻击的一种重要安全策略。在Web开发中,尤其是使用MVC框架如Struts2时,确保用户请求的唯一性和安全性至关重要。令牌机制就是这样的一个工具,它通过在表单...
Struts2提供了一种称为“令牌”或“Token Session”的机制来解决这个问题。 令牌机制的工作原理是,在用户提交表单前,服务器会生成一个唯一的令牌,并将其添加到表单中隐藏字段或者放入session。当用户提交表单时...
而Struts2的Token机制要求每个提交都带有服务器生成的唯一令牌,这使得伪造表单无法通过验证,从而有效地防御了CSRF攻击。 **四、Struts2 Token配置** 在Struts2中,可以通过配置Action或者全局Interceptor来启用...
2. 实现TokenAware接口:为了让ActionForm能够访问session中的令牌,需要让ActionForm实现`org.apache.struts.action.TokenAware`接口,并实现`setToken(String token)`方法。 3. 生成令牌:在Action中,如`execute...
Token机制是一种防止重复提交的方法,它通过在客户端(通常是浏览器)和服务器之间交换一个唯一的、一次性使用的令牌来确保请求的独特性。当用户提交表单时,服务器会生成一个随机的Token并将其存储到会话(Session...
本讲将深入探讨Struts中的令牌使用及其原理。 首先,理解为什么需要令牌机制。在Web应用中,用户可能会意外或恶意地多次点击提交按钮,导致同一请求被多次处理,这可能导致数据的不一致性和其他问题。例如,在...
#### 一、Struts令牌机制简介 Struts框架通过生成一个唯一的令牌(Token),并在每次用户提交表单时验证该令牌的有效性,以此来防止重复提交。这种机制可以确保即使用户多次点击提交按钮或者浏览器回退后重新提交...
为了避免这种情况,Struts2引入了令牌(Token)机制。 令牌机制的工作原理是这样的: 1. 当用户访问一个需要防重提交的页面时,服务器会生成一个唯一的令牌,并将其存储到用户的session中。 2. 这个令牌会被嵌入到...
- **token**: Struts2的Token插件用于防止重复提交,通过在表单中隐藏一个唯一的令牌,每次请求都会检查令牌的唯一性和时效性,从而避免了并发操作导致的问题。 6. **tablib**: Tablib可能指的是Struts2的标签库,...
Struts1是一个经典的Java Web开发框架,它在处理表单提交时可能...然而,随着技术的发展,现代框架如Spring MVC、Struts2等提供了更完善的解决方案,例如利用HTTP的幂等性或一次性令牌(如CSRF Token)来处理此类问题。
二、Struts令牌的实现步骤 1. 添加Struts令牌拦截器 在Struts的配置文件(通常为struts.xml)中,需要添加`token`和`tokenSession`拦截器到默认的拦截器栈。`token`拦截器负责在表单请求时生成和验证令牌,`token...
- 使用`token`拦截器时,如果客户端的Token丢失,可能会导致“令牌不匹配”错误,这时需要正确处理这种情况,比如提示用户重新提交。 - 考虑到并发问题,确保在多线程环境下正确处理Token。 综上所述,Struts框架...
在Struts的配置文件中定义一个Token拦截器,拦截所有需要防止重复提交的Action,然后在拦截器中实现Token的验证逻辑。 通过这种方式,Struts+Token机制可以有效地防止由于用户误操作或者网络延迟造成的表单重复提交...