struts2利用拦截器解决重复提交问题
2016-06-30 21:09
483 查看
Struts 2已经内置了能够防止用户重复提交同一个HTML表单的功能。它的工作原理:让服务器生成一个唯一记,并在服务器和表单里各保存一份这个标记的副本。此后,在用户提交表单的时候,表单里的标记将随着其他请求参数一起发送到服务器,服务器将对他收到的标记和它留存的标记进行比较。如果两者匹配,这次提交的表单被认为是有的,服务器将对之做出必要的处理并重新设置一个新标记。随后,提交相同的表单就会失败,因为服务器上的标记已经重置。
Struts 2标签中的token标签,可以用来生成一个独一无二的标记。这个标记必须嵌套在form标签中使用,它会在表单里插入一个隐藏字段并把标记保存到HttpSession对象里。toke标签必须与Token或Token Session拦截器配合使用,两个拦截器都能对token标签进行处理。Token拦截器遇到重复提交表单的情况,会返回一个"invalid.token"结果并加上一个动作级别的错误。
我们还可以使用 tokenSession 拦截器,它的功能比上面的增强,它能保证持有相同sessionId 的并发请求等待第一个完成之后才能被提交处理,但是它返回的是action 执行后的result. 接着上例,我们只需要在配置中作如下修改:把上面的 token 拦截器改成 < interceptor-ref name ="tokenSession" ></ interceptor-ref >即可。随后便可以测试,测试时会发现如果我们重复提交,它总是返回到上一次的success.jsp 页面,但是它并不是经过LoginAction 中的execute 处理后返回( 我们System.out.print 语句在重复提交时并未打印出来) ,而是此拦截器判断出是重复后直接返回上一次提交转向的,这样用户不提交多少次,就好像只是提交了一次。
例子:
要使用Struts 2的防止表单重复提交功能,需要在form标签中使用token标签,他会产生一个唯一的标识符,与其他参数一起提交到服务器,服务器会根据token标签所产生的标识符判断表单是否为重复提交的表单,这个功能是由Token拦截器完成的。
配置struts.xml文件,声明动作:需要在动作的声明中,为动作添加token拦截,因为token拦截器不在defaultStack拦截器栈中,当表单重复提交,Token拦截器会返回一个"invalid.token"结果,结果将页面转到这个页面,提示用户错误信息。
注意,需要将拦截器放在拦截器栈的第一位,这是因为判断表单是否被重复提交的逻辑应该在表单处理前。
Struts 2标签中的token标签,可以用来生成一个独一无二的标记。这个标记必须嵌套在form标签中使用,它会在表单里插入一个隐藏字段并把标记保存到HttpSession对象里。toke标签必须与Token或Token Session拦截器配合使用,两个拦截器都能对token标签进行处理。Token拦截器遇到重复提交表单的情况,会返回一个"invalid.token"结果并加上一个动作级别的错误。
我们还可以使用 tokenSession 拦截器,它的功能比上面的增强,它能保证持有相同sessionId 的并发请求等待第一个完成之后才能被提交处理,但是它返回的是action 执行后的result. 接着上例,我们只需要在配置中作如下修改:把上面的 token 拦截器改成 < interceptor-ref name ="tokenSession" ></ interceptor-ref >即可。随后便可以测试,测试时会发现如果我们重复提交,它总是返回到上一次的success.jsp 页面,但是它并不是经过LoginAction 中的execute 处理后返回( 我们System.out.print 语句在重复提交时并未打印出来) ,而是此拦截器判断出是重复后直接返回上一次提交转向的,这样用户不提交多少次,就好像只是提交了一次。
例子:
要使用Struts 2的防止表单重复提交功能,需要在form标签中使用token标签,他会产生一个唯一的标识符,与其他参数一起提交到服务器,服务器会根据token标签所产生的标识符判断表单是否为重复提交的表单,这个功能是由Token拦截器完成的。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>用户注册</h1> <form action="user_load" method="post"> 帐号:<input type="text" name="username"><br/> 密码:<input type="password" name="password"><br/> <s:token></s:token> <input type="submit" value="登录"> </form> </body> </html
配置struts.xml文件,声明动作:需要在动作的声明中,为动作添加token拦截,因为token拦截器不在defaultStack拦截器栈中,当表单重复提交,Token拦截器会返回一个"invalid.token"结果,结果将页面转到这个页面,提示用户错误信息。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <action name="user_*" class="com.zucc.action.UserAction" method="{1}"> <result name="load">/load.jsp</result> <result name="invalid.token">/token.jsp</result> <interceptor-ref name="token"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package> </struts>
注意,需要将拦截器放在拦截器栈的第一位,这是因为判断表单是否被重复提交的逻辑应该在表单处理前。
相关文章推荐
- JQuery+Strusts1.x无刷新登录
- extjs 为某个事件设置拦截器
- 浅析JAVA中过滤器、监听器、拦截器的区别
- java struts常见错误以及原因分析
- Struts之logic标签库详解
- 通过实例深入学习Java的Struts框架中的OGNL表达式使用
- java自定义拦截器用法实例
- Java的Struts框架中append标签与generator标签的使用
- PHP的拦截器实例分析
- 快速学习AngularJs HTTP响应拦截器
- Angularjs注入拦截器实现Loading效果
- Spring MVC--拦截器实现和用户登陆例子
- struts2的select标签用法实例分析
- SSH框架网上商城项目第20战之在线支付平台
- JavaWeb Struts文件上传功能实现详解
- 在Java的Struts框架下进行web编程的入门教程
- 详解Java的Struts框架中注释的用法
- java中struts 框架的实现
- 利用Java的Struts框架实现电子邮件发送功能
- 在Java的Struts框架中ONGL表达式的基础使用入门