当前位置:编程学习 > JS >>

struts2 防止重复提交 实例代码

首先说说重复提交是怎么产生的,一般情况下有两种方式:  
      
    1,页面提交后再次刷新页面。  
      
    2,在提交的时候多次点击提交按钮。  
      
    strut1.x中解决防止提交1的方法是通过重定向解决,但是方式2在网速很慢或者是用户快速的点击提交按钮时,还是能够重复提交数据。  
      
    struts2中为方式2提供了解决方案(方式1用重定向是也可以防止用户刷新页面而引起的重复提交),struts2通过使用令牌(token)解决此类的问题。  
      
    要使用token,首先在页面上在你要提交的表单中加上<s:token/>,次标签解析后会生成两个隐藏域:  
 
[html]  
<span style="font-size:12px;">    <input type ="hidden" name ="struts.token.name" value ="struts.token" />    
    <input type ="hidden" name ="struts.token" value ="LVYMI4CX9YBDS9A0AAF9UAJL8UDX1N05 " />  </span>  
 
    在该标签执行完成后会生成一个随机的值(红色部分),该值同时会加入到session中。  
     其次,就是在你个struts.xml中加入token易做图。  
   
[html]  
<package name="token-struts" extends="struts-default">    
   <interceptors>    
   <interceptor name="token"/>    
   <interceptor-stack name="token-default">    
   <interceptor-ref name=" token "/>    
   <interceptor-ref name="defaultStack"/>    
   </interceptor-stack>    
   </interceptors>    
   <default-interceptor-ref name="token-default"/>     
   </package>  
 
  
    如果是用注解的话,那么的action要这么定义:@ParentPackage("token-struts")。  
    如果不是注解,可以将上面的易做图栈加入到你的actin定义中。  
    这样就完成了整个防止重复提交的任务了。  
    如果你想了解此易做图是这么工作的,你可以打开源码看看,其中TokenHelper.validToken()最是关键,就是通过这个帮助类完成对令牌的判断。  
      
    上述是可以解决重复提交的问题,但是随之而来的又是一个麻烦。  
    易做图顾名思义就是用来对请求进行拦截的,一个请求在执行前就被拦截了,默认情况下易做图会拦截被配置下所有的请求。但是很多情况下该配置下的其他请求不需要这个拦截,比如删除,更新操作。就完成不需要这个易做图去拦截。易做图又不能区分不同的请求而做出不同的操作。  
      
    这种情况就有两种解决方案:  
    第一,不用token易做图,只在你需要防止重复提交的action处理方法中加入 TokenHelper.validToken()这个判断,如果为返回true就执行,否则跳过。  
    第二,用token易做图,但是重写此易做图TokenInterceptor。在重写的易做图中判断tokenNames,如果值为空则不做任何操作,如果有值则做拦截。
 
 
 
 
 
1、使用Struts2的表单标签,其中需要增加token标签。index.jsp表单页面
 
 
 
 
[html]  
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
<%@ taglib uri="/struts-tags" prefix="s"%>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
  <head>  
      
    <title>防止表单重复提交</title>  
    <meta http-equiv="pragma" content="no-cache">  
    <meta http-equiv="cache-control" content="no-cache">  
    <meta http-equiv="expires" content="0">     
  </head>  
    
  <body>  
      <!-- 防止表单重复提交,记得在form表单里填上<s:token></s:token>      -->  
      <!-- action="token"、action="tokenSession" -->  
      <s:form action="token" namespace="/test" method="post">  
          姓名:<s:textfield name="name"/><s:token></s:token>  
          <input type="submit" value="发送"/>  
      </s:form>  
  </body>  
</html>  
 
 
 
2.PersonAction类
 
 
 
[java]  
<span style="font-size:12px;">package com.ljq.action;  
  
  
import java.util.ArrayList;  
import java.util.List;  
  
public class PersonAction {  
      
    private String name;  
  
    @SuppressWarnings("unchecked")  
    //观看控制台  
    //如果token生效则不会在控制台输出name的值,而会输出如下警告: 2011-3-14 20:45:32 com.opensymphony.xwork2.util.logging.commons.CommonsLogger   
    //warn 警告: Form token EDZ4S96RNDN5VD8B1CQTK6FTHIJUPC66 does not match the session token null.  
    public String execute() {  
        List ls = new ArrayList();  
        ls.add(name);  
        for (int i = 0; i < ls.size(); i++) {  
            System.out.println(ls.get(i));  
        }  
        return "success";  
    }  
      
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
}</span>  
 
 
 
 
3.struts.xml配置文件
 
 
 
[html]  
<span style="font-size:12px;"><?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE struts PUBLIC  
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
    "http://s
补充:Web开发 , Jsp ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,