重复提交的处理(struts)

在做网站开发时,经常会遇到表单提交,如果提交表单后,用户通过工具栏后退按纽退回到提交数据的原始页面,再次提交那数据库中又插如了一条记录,反复如此,数据库中的记录会有很多是重复的.那如何才能在服务器端检测到用户是重复提交的呢??在用到struts做控制的,struts给了一套实现.

 原来是:insert.jsp负责让用户填写数据并提交数据至服务器.然后通过actionservlet交给特定的action处理.

  现在是:先请求一个预处理的action,在这个action里把当前的session和当前系统时间按照一定的算法组成一个字符串存起来(这个字符串叫token).然后在转发到insert.jsp(如代码一),

/*
 * Generated by MyEclipse Struts
 * Template path: templates/java/JavaClass.vtl
 
*/

package  com.test.struts.action;

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;

/** 
 * MyEclipse Struts
 * Creation date: 02-25-2008
 * 
 * XDoclet definition:
 * @struts.action path="/preInsert" name="booksForm" scope="request" validate="true"
 
*/

public class PreInsertAction extends Action  {
    
/*
     * Generated Methods
     
*/


    
/** 
     * Method execute
     * 
@param
 mapping
     * 
@param
 form
     * 
@param
 request
     * 
@param
 response
     * 
@return
 ActionForward
     
*/

    
public ActionForward execute(ActionMapping mapping, ActionForm form,
            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:

  1. 不存在httpsession对象时
  2. 在session范围中没保存token时
  3. 在请求参数中没有token
  4. 当前用户范围session中保存的token和请求参数中的token参数不匹配
/*
 * Generated by MyEclipse Struts
 * Template path: templates/java/JavaClass.vtl
 
*/

package  com.test.struts.action;

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;

/** 
 * MyEclipse Struts
 * Creation date: 02-25-2008
 * 
 * XDoclet definition:
 * @struts.action path="/insert" name="booksForm" scope="request" validate="true"
 
*/

public class InsertAction extends Action  {
    
/*
     * Generated Methods
     
*/


    
/** 
     * Method execute
     * 
@param
 mapping
     * 
@param
 form
     * 
@param
 request
     * 
@param
 response
     * 
@return
 ActionForward
     
*/

    
public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) 
{
        BooksForm booksForm 
= (BooksForm) form;// TODO Auto-generated method stub

        if(!isTokenValid(request)){
            saveToken(request);
            request.getSession().setAttribute(
"info""重复提交000"
);
            
return mapping.findForward("fail"
);
        }
else{
            resetToken(request);
        }

        String info 
=booksForm.getBookName()+":"+booksForm.getBookInfo();
        request.getSession().setAttribute(
"info"
, info);
        
return mapping.findForward("suc"
);
    }

}

(代码二)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值