在做网站开发时,经常会遇到表单提交,如果提交表单后,用户通过工具栏后退按纽退回到提交数据的原始页面,再次提交那数据库中又插如了一条记录,反复如此,数据库中的记录会有很多是重复的.那如何才能在服务器端检测到用户是重复提交的呢??在用到struts做控制的,struts给了一套实现.
原来是:insert.jsp负责让用户填写数据并提交数据至服务器.然后通过actionservlet交给特定的action处理.
现在是:先请求一个预处理的action,在这个action里把当前的session和当前系统时间按照一定的算法组成一个字符串存起来(这个字符串叫token).然后在转发到insert.jsp(如代码一),
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package
com.test.struts.action;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
org.apache.struts.action.Action;
import
org.apache.struts.action.ActionForm;
import
org.apache.struts.action.ActionForward;
import
org.apache.struts.action.ActionMapping;
import
com.test.struts.form.BooksForm;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/** */
/**
* MyEclipse Struts
* Creation date: 02-25-2008
*
* XDoclet definition:
* @struts.action path="/preInsert" name="booksForm" scope="request" validate="true"
*/
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public class PreInsertAction extends Action ...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//*
* Generated Methods
*/
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/** *//**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
HttpServletRequest request, HttpServletResponse response) ...{
saveToken(request);
return mapping.findForward("insert");
}
}
( 代码一)
在insert.jsp中 <html:form >标签会生成一个隐藏域,用来存储token,用户输入数据确认提交到特定的处理这些数据的action,同时也把隐藏域中的token传到这个action中,这个acion在自己的execute方法中先判断token是否合法(struts通过action的isTokenValid方法验证),如果不合法,则根据现有的request参数重新保存一个token(调用saveToken),并返回错误.如果合法就进行数据库操作,最后删除token就行了(调用action的resetToken方法).(如代码二)
isTokenValid方法在以下四种情况时返回false:
- 不存在httpsession对象时
- 在session范围中没保存token时
- 在请求参数中没有token
- 当前用户范围session中保存的token和请求参数中的token参数不匹配
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package
com.test.struts.action;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
org.apache.struts.action.Action;
import
org.apache.struts.action.ActionForm;
import
org.apache.struts.action.ActionForward;
import
org.apache.struts.action.ActionMapping;
import
com.test.struts.form.BooksForm;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/** */
/**
* MyEclipse Struts
* Creation date: 02-25-2008
*
* XDoclet definition:
* @struts.action path="/insert" name="booksForm" scope="request" validate="true"
*/
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public class InsertAction extends Action ...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//*
* Generated Methods
*/
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/** *//**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
HttpServletRequest request, HttpServletResponse response) ...{
BooksForm booksForm = (BooksForm) form;// TODO Auto-generated method stub
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(!isTokenValid(request))...{
saveToken(request);
request.getSession().setAttribute("info", "重复提交000");
return mapping.findForward("fail");
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}else...{
resetToken(request);
}
String info =booksForm.getBookName()+":"+booksForm.getBookInfo();
request.getSession().setAttribute("info", info);
return mapping.findForward("suc");
}
}
(代码二)