论坛首页 Java企业应用论坛

struts token解决用户重复提交问题详解

浏览 16267 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-02-20  
我们在bbs上经常会看到注册这个页面.假如用户已经全部填写了符合规范的信息,数据将全部提交到数据中.为了避免用户通过浏览器的后退功能.出现重复提交的可能.struts可以用token来解决重复提交的问题.源码和注释见附件
总结出来,希望对初学者有所帮助.
建一个Insert.jsp页面代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html:html locale="true">
  <head>
    <html:base />
     <title>insert.jsp</title>
  </head>
   <body>
  <html:form action="insert" method="post">
    <bean:message key="label.name"/><html:text property="name" />
   <bean:message key="label.phone"/><html:text property="phone"/>
    <bean:message key="label.address"/><html:text property="address"/>
    <html:submit ><bean:message key="modify.add"/></html:submit>
     <html:reset><bean:message key="button.reset"/></html:reset>
  </html:form>
<html:errors/>
  </body>
</html:html>
建一个InsertAction代码如下:
//Created by MyEclipse Struts
// XSL source (default): platform:/plugin/com.genuitec.eclipse.cross.easystruts.eclipse_4.1.1/xslt/JavaClass.xsl

package com.yourcompany.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.yourcompany.bean.ListBean;
import com.yourcompany.struts.form.ModifyForm;

/**
* MyEclipse Struts
* Creation date: 02-20-2007
*
* XDoclet definition:
* @struts.action validate="true"
*/
public class InsertAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModifyForm modifyForm = (ModifyForm) form;
//得到token
        String token_request =request.getParameter("org.apache.struts.taglib.html.TOKEN");
        //打出来看看是什么东东
        System.out.println("token in request is:"+ token_request);
        ActionErrors errors = new ActionErrors();
        //判断token是否有效,如果为假证明有重复提交,声明一个错误信息,并反馈出来
        if(!isTokenValid(request)){
     errors.add("insettoken",new ActionError("error.invalid.token"));

           saveErrors(request, errors);
           saveToken(request);
           return (new ActionForward(mapping.getInput()));
  }
        //当用户首次提交时返!isTokenValid()返回true
  else{
        resetToken(request);
  } 
        int result=new ListBean().add(modifyForm);

if(result==1){
return mapping.findForward("addlist");
}else{
return mapping.findForward("error");
}
}

}
建一个PrepareInsertAction代码如下:
package com.yourcompany.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;

/**
* MyEclipse Struts
* Creation date: 02-20-2007
*
* XDoclet definition:
* @struts.action validate="true"
*/
public class PrepareInsertAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
        System.out.print("hello PrepareInsertAction");
        //创建一个新的令牌
        saveToken(request);
        return mapping.findForward("inserttoken");
}
}
详细代码见附件的源码.程序里我已经写了相关的注释.
希望对大家能有所帮助.
  • token.rar (1.6 MB)
  • 描述: 程序源码
  • 下载次数: 2445
   发表时间:2007-02-28  
这个问题我正是比较想知道的.

因为有的用户会"回退"或是提交再刷新.
0 请登录后投票
   发表时间:2007-06-20  
第一次 提交后,再退回来再提交的话,的确是阻止了重复提交,
但是再多点几次,就出现问题了,多点了几次,就阻止不了了。
0 请登录后投票
   发表时间:2007-06-20  
解决关于STRUTS的重复提交只有用TOKEN这一种方法吗?
感觉很麻烦,在每一个ACTION中都要加入那些代码.

是不是还有别的更好的方法呢?
0 请登录后投票
   发表时间:2007-06-20  
InsertAction 类中的

if(!isTokenValid(request)){
errors.add("insettoken",new ActionError("error.invalid.token"));

saveErrors(request, errors);
saveToken(request);
return (new ActionForward(mapping.getInput()));
}

中的  saveToken(request) 应该改为resetToken(request)
这样的话,才能真正解决重复提交问题
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics