表单重复提交处理总结

1、重复提交的处理方式 html

    1.在进行请求以后重定向到查询或者其余不操做数据库的请求
    2.将页面事件执行的按钮置灰,防止重复点击触发请求
    3.自定义设置token,在请求以前将随机的token值放入session中,执行请求时候讲session中的token值删除,重复提交时候由于session中的token值不存在,判断该请求已经提交过不处理
    4.数据库层加锁,对该记录的操做锁表,其他对该记录操做的请求要等待 java

2、struts2的token配置与项目实例 web

    Struts标签库里面有<s:token/>标签,在页面隐藏域中添加随机值得token参数,提交表单后一块儿做为参数传递到后台放入session,struts配置token后不容许相同tbken的表单提交。
期待结果:
    请求http://localhost:8080/token/index.action 数据库

    点击按钮: apache

    刷新页面: json

    Struts2的token设置记录(maven、jetty): api

 

    pom.xml session

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>cn.dx</groupId>
  <artifactId>struts2token</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>struts2token Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>

        <!-- junit -->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <scope>test</scope>
        </dependency>

        <!-- struts2 -->
      <dependency>
          <groupId>org.apache.struts</groupId>
          <artifactId>struts2-core</artifactId>
          <version>2.3.24.1</version>
      </dependency>
      <dependency>
          <groupId>org.apache.struts</groupId>
          <artifactId>struts2-json-plugin</artifactId>
          <version>2.3.24.1</version>
      </dependency>

      <!-- jsp-api -->
      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
      </dependency>

  </dependencies>
  <build>
    <finalName>struts2token</finalName>
    <plugins>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>utf8</encoding>
                </configuration>
        </plugin>
        <plugin>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>8.0.0.M3</version>
        </plugin>

    </plugins>


  </build>
</project>


    struts.xml配置: app

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>

	<package name="dx-default" extends="json-default" namespace="/">
	
    	<interceptors>
           <interceptor name="loginInterceptor" class="cn.dx.interceptor.LoginInterceptor"/>
           <interceptor-stack name="dxStack">
            	<interceptor-ref name="loginInterceptor" />
            	<!-- <interceptor-ref name="SysVisitStatusInterceprot" /> -->
              <interceptor-ref name="defaultStack"></interceptor-ref>
           </interceptor-stack>
     	</interceptors>
      
     	<default-interceptor-ref name="dxStack"/>

	</package>
 
 	<include file="struts/dx-stoken.xml" />


</struts>

    dx-token.xml配置: jsp

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

        <package name="dx-token" extends="dx-default" namespace="/token">
                <action name="index" class="cn.dx.action.TokenAction" method="index">
                        <result name="index">index.jsp</result>
                </action>
                <action name="addTest" class="cn.dx.action.TokenAction" method="addTest">
                        <result name="success">success.jsp</result>
                        <result name="invalid.token">error.jsp</result>
                        <interceptor-ref name="defaultStack"/>
                        <interceptor-ref name="token"/>
                </action>
        </package>

</struts>

    web.xml配置:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>struts2token</display-name>
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        <init-param>
            <param-name>config</param-name>
            <param-value>struts-default.xml,struts-plugin.xml,struts/struts.xml</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

       拦截器LoginInterceptor

package cn.dx.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import org.apache.struts2.ServletActionContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Created by liuxiongwei on 2015/12/22.
 */
public class LoginInterceptor extends AbstractInterceptor{

    @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
        HttpServletRequest request=ServletActionContext.getRequest();
        HttpServletResponse response= ServletActionContext.getResponse();
        HttpSession session=request.getSession();
        String reqURI = request.getRequestURI();
        System.out.println("reqURI = " + reqURI);
       /* if(reqURI.endsWith("index.action")){
            return actionInvocation.invoke();
        }else{
            if(session.getAttribute("currentUser")!=null){
                return  actionInvocation.invoke();
            }else{
                response.sendRedirect(request.getContextPath()+"/login.jsp");
            }
        }*/
        actionInvocation.invoke();
        return null;
    }
}

    action:TokenAction

package cn.dx.action;

import com.opensymphony.xwork2.ActionSupport;

/**
 * Created by liuxiongwei on 2015/12/22.
 */
public class TokenAction extends ActionSupport{
    public String name;
    public String address;

    public String index() {
        System.out.println("进入首页成功!");
        return "index";
    }

    public String addTest(){
        System.out.println("token");
        System.out.println("name: "+name);
        System.out.println("address: "+address);
        return SUCCESS;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

    index.jsp

<%--
  Created by IntelliJ IDEA.
  User: liuxiongwei
  Date: 2015/12/22
  Time: 21:49
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<html>
<head>
    <title>token测试</title>
</head>
<body>

    <s:form action="addTest" method="get">
        <s:token/>
        <s:submit type="button">测试token</s:submit>
    </s:form>

</body>
</html>

    success.jsp

<%--
  Created by IntelliJ IDEA.
  User: liuxiongwei
  Date: 2015/12/22
  Time: 22.58
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>token第一次提交结果</title>
</head>
<body>
  <h1>token第一次提交结果!</h1>
</body>
</html>

    error.jsp

<%--
  Created by IntelliJ IDEA.
  User: liuxiongwei
  Date: 2015/12/22
  Time: 23:01
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>token重复提交</title>
</head>
<body>
  <h1 style="color: red">token重复提交!</h1>
</body>
</html>
相关文章
相关标签/搜索