Struts是Apache软件基金会的一个开源项目,它是一个用于构建企业级Java Web应用程序的MVC(Model-View-Controller)框架。在Web开发中,重复提交是一个常见的问题,可能导致数据不一致或者服务过载。为了解决这个问题,Struts提供了一个名为“Token”的机制。 **一、Struts Token机制** Struts的Token机制主要用来防止用户意外或恶意的多次提交表单,例如在刷新页面时重复提交数据。它的工作原理如下: 1. **生成Token**: 当用户访问一个需要防重复提交的表单时,服务器会生成一个唯一的Token并将其存储在服务器端(比如Session)和客户端(通常隐藏在表单中)。 2. **提交表单**: 用户填写表单并点击提交按钮,这个Token会随着表单一起发送到服务器。 3. **验证Token**: 服务器接收到请求后,首先检查请求中的Token是否与服务器端保存的Token匹配,如果匹配,则执行业务逻辑;如果不匹配或已存在相同的Token,服务器将忽略这次提交,通常返回错误信息。 4. **清理Token**: 无论成功还是失败,提交后服务器都会清除当前的Token,以防止用户再次刷新页面导致重复提交。 **二、实现步骤** 1. **配置Action**: 在Struts配置文件(如struts.xml)中,为需要防止重复提交的Action添加`token`拦截器。 ```xml <action name="myAction" class="com.example.MyAction"> <interceptor-ref name="token"/> <interceptor-ref name="defaultStack"/> <result name="success">/success.jsp</result> <result name="input">/input.jsp</result> </action> ``` 2. **创建Action**: 在Action类中,可以重写`supports()`方法来决定哪些方法需要Token验证,或者直接在方法上使用`@TokenCheck`注解。 ```java public class MyAction extends ActionSupport { @Override public String execute() { // 业务逻辑 } @TokenCheck public String customMethod() { // 业务逻辑 } } ``` 3. **生成Token**: 在JSP页面中,使用`<s:token/>`标签生成并隐藏Token。 ```jsp <form action="myAction.action" method="post"> <!-- 表单元素 --> <input type="hidden" name="struts.token" value="<s:token/>" /> <input type="submit" value="提交" /> </form> ``` 4. **处理结果**: 如果用户重复提交,Struts会自动跳转到输入页面(`input.jsp`),你可以自定义错误消息。 **三、注意事项** 1. **Session管理**: Token存储在Session中,因此需要考虑Session的生命周期和管理,避免内存泄露。 2. **跨页提交**: 如果表单跨越多个页面,需要确保每个页面都正确处理Token。 3. **异常处理**: 对于网络中断或其他异常情况,需要考虑如何处理未完成的请求和Token。 4. **安全考虑**: Token是为了防止无意的重复提交,但不能防止恶意攻击,仍需结合其他安全措施。 5. **兼容性**: 对于非表单提交(如Ajax),可能需要自定义处理方式。 通过以上方法,Struts的Token机制能有效防止Web应用中的重复提交问题,确保数据的准确性和一致性。不过,随着技术的发展,现代框架如Spring Boot等提供了更先进的解决方案,例如CSRF(跨站请求伪造)保护,可以考虑结合使用。
- 1
- 微篮2011-11-18这样子页面只能提交一次啊,不是我想要的
- 粉丝: 50
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于ESP8266的WebDAV服务器与3D打印机管理系统.zip
- (源码)基于Nio实现的Mycat 2.0数据库代理系统.zip
- (源码)基于Java的高校学生就业管理系统.zip
- (源码)基于Spring Boot框架的博客系统.zip
- (源码)基于Spring Boot框架的博客管理系统.zip
- (源码)基于ESP8266和Blynk的IR设备控制系统.zip
- (源码)基于Java和JSP的校园论坛系统.zip
- (源码)基于ROS Kinetic框架的AGV激光雷达导航与SLAM系统.zip
- (源码)基于PythonDjango框架的资产管理系统.zip
- (源码)基于计算机系统原理与Arduino技术的学习平台.zip