`
lyx_2709
  • 浏览: 314657 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

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

阅读更多
我们在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
分享到:
评论
5 楼 p48376382 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)
这样的话,才能真正解决重复提交问题
4 楼 xuehongliang 2007-06-20  
解决关于STRUTS的重复提交只有用TOKEN这一种方法吗?
感觉很麻烦,在每一个ACTION中都要加入那些代码.

是不是还有别的更好的方法呢?
3 楼 p48376382 2007-06-20  
第一次 提交后,再退回来再提交的话,的确是阻止了重复提交,
但是再多点几次,就出现问题了,多点了几次,就阻止不了了。
2 楼 zhdsh1979 2007-06-20  
OK,Good!
1 楼 justcode 2007-02-28  
这个问题我正是比较想知道的.

因为有的用户会"回退"或是提交再刷新.

相关推荐

    详解struts2的token机制和cookie来防止表单重复提交

    详解struts2的token机制和cookie来防止表单重复提交 今天在做一个投票系统时要实现防止表单重复提交! 当时就想到了用struts2提供的token机制 struts2的token机制防止表单重复提交: 首先需要在提交的jsp页面(要...

    struts1 练习

    如果Token已经使用过或者过期,就会阻止再次提交,从而避免了用户意外或恶意的重复操作。 6. **实践操作**: 实践中,你可以通过修改已有的Struts1工程来学习这些概念。例如,创建一个新的Action,编写对应的...

    自定义拦截器实现防止重复提交-5页.pdf

    在Web开发中,防止重复提交是一项重要的任务,因为这可以避免用户意外或恶意地多次执行相同的操作,导致数据的不一致。在Java Web应用中,Struts2框架提供了一种拦截器(Interceptor)机制来处理这类问题。然而,...

    struts1的相关代码

    Struts1可以通过两种方式解决:一是使用令牌(Token)机制,用户在提交表单时,服务器会生成一个唯一的令牌并存入session,同时将令牌放入隐藏字段。当表单提交时,服务器检查令牌是否有效,若已使用则拒绝处理。二...

    低清版 大型门户网站是这样炼成的.pdf

    3.4.16 token标签详解 150 3.4.17 updownselect标签详解 151 3.5 struts 2 ajax标签详解 156 3.5.1 a与submit标签详解 157 3.5.2 autocompleter标签详解 158 3.5.3 datetimepicker标签详解 160 3.5.4 div标签...

    jsp在线新闻与评论系统

    5. **安全防护**:防止SQL注入、XSS攻击等网络安全问题,对用户输入进行过滤和转义。 ### 关系模型 在数据库设计中,新闻和评论之间通常建立一对多关系。一条新闻可以有多个评论,但一个评论只属于一条特定的新闻...

    ssm+element+axios后台加前台.zip

    【SSM框架详解】 SSM框架是Java Web开发中常用的一种组合框架,它由Spring、Struts和MyBatis三个组件组成。这个压缩包“ssm+element+axios后台加前台.zip”很可能是包含了使用SSM框架开发的前后台代码。 1. **...

    java做的联机在线试题系统

    【Java实现的在线试题系统详解】 Java是一种广泛使用的高级编程语言,尤其在开发企业级应用时,其稳定性和跨平台特性使其成为首选。本系统基于Java技术,采用面向对象的设计方法,构建了一个功能完备的联机在线试题...

    大小企业java web方面的笔试题集锦

    12. Struts:ActionForm、Action、Interceptor的概念,以及Struts配置文件的理解。 13. Spring MVC:DispatcherServlet、ModelAndView、Controller、HandlerMapping、HandlerAdapter等核心概念。 14. Hibernate:ORM...

Global site tag (gtag.js) - Google Analytics