Token防止页面重复提交
时间:2010-10-12 来源:admin126com
如果哪里有说的不对的地方,希望各位朋友指正
操作:
1.在以前的一个项目中,因为提交后,返回到维护页面,所以当提交后,并不后退,而是一直刷新,那么其实它是在一直做第一次提交的操作
2.当返回到维护页面后查看源代码,为什么新生成的"32位随机码"在页面的隐藏域里已经变了,但提交的时候,还是输出第一次的"32位随机码"呢,因为隐藏域的码确实是变了,但提交的并不是你再一次点击的"提交按钮"动作,而是还是第一次提交的动作,所以刷新是在执行第一次提交的动作
注意:
1.token.jsp必须用html:form标签
记住一点,Struts在你每次访问Action的时候,都会产生一个令牌,保存在你的Session里面,如果你在Action里的函数里面,使用了saveToken(request);,那么这个令牌也会保存在这个Action所Forward到的jsp所生成的静态页面里。
如果你在你Action的方法里使用了isTokenValid,那么Struts会将你从你的request里面去获取这个令牌值,然后和Session里的令牌值做比较,如果两者相等,就不是重复提交,如果不相等,就是重复提交了。
当然你也可以在你的action所继承的父类里面做表单重复提交的控制,这样就可以不用在所有的子类里来分别再写防止重复提交的代码
index.jsp
Java代码
Java代码
token.jsp
Java代码
struts-config.xml
Java代码
重点就两步:
1.在要跳转到页面的类里那个方法里调用saveToken(HttpServletRequest request)方法
2.在页面的要调用类的添加方法里调用isTokenValid(HttpServletRequest request,boolean arg1)方法
操作:
1.在以前的一个项目中,因为提交后,返回到维护页面,所以当提交后,并不后退,而是一直刷新,那么其实它是在一直做第一次提交的操作
2.当返回到维护页面后查看源代码,为什么新生成的"32位随机码"在页面的隐藏域里已经变了,但提交的时候,还是输出第一次的"32位随机码"呢,因为隐藏域的码确实是变了,但提交的并不是你再一次点击的"提交按钮"动作,而是还是第一次提交的动作,所以刷新是在执行第一次提交的动作
注意:
1.token.jsp必须用html:form标签
记住一点,Struts在你每次访问Action的时候,都会产生一个令牌,保存在你的Session里面,如果你在Action里的函数里面,使用了saveToken(request);,那么这个令牌也会保存在这个Action所Forward到的jsp所生成的静态页面里。
如果你在你Action的方法里使用了isTokenValid,那么Struts会将你从你的request里面去获取这个令牌值,然后和Session里的令牌值做比较,如果两者相等,就不是重复提交,如果不相等,就是重复提交了。
当然你也可以在你的action所继承的父类里面做表单重复提交的控制,这样就可以不用在所有的子类里来分别再写防止重复提交的代码
index.jsp
Java代码
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>My JSP 'index.jsp' starting page</title>
- </head>
- <body>
- <html:link action="token.do?method=token">Token</html:link>
- </body>
- </html>
- TokenAction.java
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> <html:link action="token.do?method=token">Token</html:link> </body> </html> TokenAction.java
Java代码
- public class TokenAction extends DispatchAction {
- public ActionForward token(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response) {
- TokenForm tokenForm = (TokenForm) form;
- //saveToken创建一个新令牌,如果没有调用此方法,那么页面不会生成隐藏标签
- this.saveToken(request);
- return mapping.findForward("token");
- }
- public ActionForward add(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response) {
- TokenForm tokenForm = (TokenForm) form;
- //如果为假,则进行了重复提交
- if(isTokenValid(request,true)){
- System.out.println("正常提交");
- this.resetToken(request);
- }else{
- System.out.println("重复提交");
- //重新生成令牌
- this.saveToken(request);
- return mapping.getInputForward();
- }
- return mapping.findForward("token");
- }
- }
public class TokenAction extends DispatchAction { public ActionForward token(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { TokenForm tokenForm = (TokenForm) form; //saveToken创建一个新令牌,如果没有调用此方法,那么页面不会生成隐藏标签 this.saveToken(request); return mapping.findForward("token"); } public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { TokenForm tokenForm = (TokenForm) form; //如果为假,则进行了重复提交 if(isTokenValid(request,true)){ System.out.println("正常提交"); this.resetToken(request); }else{ System.out.println("重复提交"); //重新生成令牌 this.saveToken(request); return mapping.getInputForward(); } return mapping.findForward("token"); } }
token.jsp
Java代码
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
- <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
- <html>
- <head>
- <title>JSP for TokenForm form</title>
- </head>
- <body>
- <html:form action="/token.do?method=add">
- 查看源代码可以看到隐藏标签,隐藏域value值的"32位随机码<br>
- 姓名: <html:password property="username"/><br/>
- 密码 : <html:text property="password"/><br/>
- <html:submit/><html:cancel/>
- </html:form>
- </body>
- </html>
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> <html> <head> <title>JSP for TokenForm form</title> </head> <body> <html:form action="/token.do?method=add"> 查看源代码可以看到隐藏标签,隐藏域value值的"32位随机码<br> 姓名: <html:password property="username"/><br/> 密码 : <html:text property="password"/><br/> <html:submit/><html:cancel/> </html:form> </body> </html>
struts-config.xml
Java代码
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
- <struts-config>
- <data-sources />
- <form-beans >
- <form-bean name="tokenForm" type="com.dahai.struts.form.TokenForm" />
- </form-beans>
- <global-exceptions />
- <global-forwards />
- <action-mappings >
- <action
- attribute="tokenForm"
- input="/token.jsp"
- name="tokenForm"
- parameter="method"
- path="/token"
- scope="request"
- type="com.dahai.struts.action.TokenAction" >
- <forward name="token" path="/token.jsp"/>
- </action>
- </action-mappings>
- <message-resources parameter="com.dahai.struts.ApplicationResources" />
- </struts-config>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <data-sources /> <form-beans > <form-bean name="tokenForm" type="com.dahai.struts.form.TokenForm" /> </form-beans> <global-exceptions /> <global-forwards /> <action-mappings > <action attribute="tokenForm" input="/token.jsp" name="tokenForm" parameter="method" path="/token" scope="request" type="com.dahai.struts.action.TokenAction" > <forward name="token" path="/token.jsp"/> </action> </action-mappings> <message-resources parameter="com.dahai.struts.ApplicationResources" /> </struts-config>
重点就两步:
1.在要跳转到页面的类里那个方法里调用saveToken(HttpServletRequest request)方法
2.在页面的要调用类的添加方法里调用isTokenValid(HttpServletRequest request,boolean arg1)方法
相关阅读 更多 +