`
lyx_2709
  • 浏览: 316739 次
  • 性别: 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机制** 1. **添加Token标签**:在需要防止重复提交的JSP页面中,使用Struts2的`&lt;s:token&gt;`标签。这个标签会在...

    防重复提交代码

    ### 防止重复提交代码知识点详解 #### 一、问题背景 在Web应用程序中,特别是在使用Java进行后端开发时,重复提交问题是常见的技术挑战之一。例如,在用户提交表单后,由于网络延迟或其他原因导致用户多次点击提交...

    tokenSession拦截器的使用

    在Java Web应用开发中,Struts2框架提供了一种非常实用的方法来解决这个问题——通过使用`tokenSession`拦截器。相比于传统的`token`拦截器,`tokenSession`提供了更加灵活和友好的用户体验。本文将深入探讨`token...

    struts2 详解文档

    24. **防止重复提交**:可以使用s:token标签防止表单重复提交的问题。 25. **Struts2整合Spring和Hibernate**:Struts2与Spring的整合可以实现依赖注入,与Hibernate的整合则方便进行持久化操作。 以上就是Struts2...

    struts2令牌

    在Web应用程序开发过程中,为了防止重复提交表单或CSRF(跨站请求伪造)等安全问题,Struts2框架提供了一种名为“令牌”的机制。该机制通过在用户会话中存储一个随机生成的唯一值,并在表单提交时验证该值是否有效来...

    15年9月传智播客视频struts2

    - **内置拦截器**:Struts2提供了一系列内置拦截器,如`params`(参数填充)、`token`(防止重复提交)、`servletConfig`(获取Servlet配置信息)等。 - **自定义拦截器**:可以通过实现`Interceptor`接口或继承`...

    struts1 练习

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

    Struts2面试题

    ### Struts2面试题知识点详解 #### 一、Struts2的工作流程 1. **请求接收**:所有的请求首先会被`StrutsPrepareAndExecuteFilter`接收。 2. **请求识别**:`StrutsPrepareAndExecuteFilter`判断这个请求是否属于...

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

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

    struts1的相关代码

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

    struts2标签库实验报告.docx

    ### Struts2标签库知识点详解 #### 一、实验背景及目标 本实验报告主要针对Struts2框架中的标签库进行深入研究与实践。通过实验,学员能够掌握Struts2中几个常用标签(如`&lt;s:radio&gt;`、`&lt;s:select&gt;`、`&lt;s:token&gt;`)...

    struts课件2

    本课件主要涵盖了Struts框架中的几个关键概念和技术,包括Validator框架、国际化支持、不同类型的DispatcherAction、动态ActionForm以及如何处理表单的重复提交等问题。以下是针对这些知识点的详细解释。 #### 二、...

    研磨Struts2

    - **Token机制**:每次提交前生成一个唯一的Token,并将其存入session,在提交时进行验证。 - **服务器端控制**:记录每个请求的状态,对于已经处理过的请求不再处理。 ### 知识点十四:整合jfreechart #### 14.1 ...

    学习struts很好的文档

    利用Token解决重复提交 Struts提供了一种机制来防止表单重复提交,即通过生成唯一的Token并在每次表单提交时检查该Token的有效性。 ##### 2.Struts应用的国际化 Struts支持通过配置资源文件实现国际化,使应用...

    Struts_2.0从入门到精通

    Struts2.0引入了一系列新的表单标签,如、、&lt;s:token&gt;等,它们提供了更丰富和灵活的表单元素,支持客户端验证和服务器端验证的无缝集成。 十三、Struts2.0与AJAX的融合 AJAX技术的兴起,为Web应用带来了全新的交互...

    传智播客 struts课程笔记 赖家材

    - **防止表单重复提交**:通过使用令牌(token)机制来防止用户的重复提交操作。 - **Struts 验证框架**:Struts 提供了一个强大的验证框架,可以在客户端和服务器端对用户输入进行验证,确保数据的有效性和安全性...

    struts2-s标签

    ### Struts2 S 标签库详解 #### 引言 Struts2 是一款流行的 Java Web 开发框架,它提供了一系列强大的功能来帮助开发者构建健壮的 Web 应用程序。其中,Struts2 的标签库是其核心特性之一,为开发者提供了丰富的 ...

    Struts2内置拦截器简介

    - **用途**:防止表单重复提交,通过在每次提交时生成一个唯一的令牌,并在服务器端进行验证。 24. **Token Session (会话令牌)** - **说明**:与Token拦截器类似,但使用`HttpSession`存储令牌,适用于需要长...

    struts.doc

    - **1.1 解决重复提交 Token** - **作用**:为每个表单生成一个唯一的Token值,并在提交时检查这个值是否已被使用过。 - **示例代码**: ```jsp &lt;%@ taglib uri="http://struts.apache.org/tags-...

Global site tag (gtag.js) - Google Analytics