文档章节

表单重复提交处理总结

liuxw0226
 liuxw0226
发布于 2015/12/22 23:13
字数 954
阅读 152
收藏 14

一、重复提交的处理方式

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

二、struts2的token配置与项目实例

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

    点击按钮:

    刷新页面:

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

 

    pom.xml

<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配置:

<?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配置:

<?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>







© 著作权归作者所有

共有 人打赏支持
liuxw0226

liuxw0226

粉丝 7
博文 19
码字总数 8419
作品 0
顺义
后端工程师
mysql并发插入重复数据问题的解决思路

一、问题描述 涉及到的功能是一个表单页面添加数据,后端接口的功能就是往数据库中写入表单的数据,系统属于后台系统,但因为跟钱有关,添加的数据要保证同一次填写的数据只能入一次库。 测试...

八月下沙
2016/12/21
206
0
谈谈防止重复点击提交

首先说说防止重复点击提交是什么意思。   我们在访问有的网站,输入表单完成以后,单击提交按钮进行提交以后,提交按钮就会变为灰色,用户不能再单击第二次,直到重新加载页面或者跳转。这...

五大三粗
2015/12/26
216
0
防止重复提交表单

在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复...

奋斗的小菜一碟
2016/01/18
478
0
使用Session防止表单重复提交

 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重...

Galy_绿
2015/12/01
100
0
SpringMVC 防止表单提交的解决方案

在平时开发中,如果网速比较慢的情况下, 用户提交表单后,发现服务器半天没有响应,用户可能以为是自己没有提交表单,就会再点击提交按钮重复提交表单,所以在开发中我们需要防止表单重复提交 1....

陈小扁
2016/04/22
254
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
6分钟前
0
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
40分钟前
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
0
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
2
0
设计模式之五 责任链模式(Chain of Responsibility)

一. 场景 相信我们都有过这样的经历; 我们去职能部门办理一个事情,先去了A部门,到了地方被告知这件事情由B部门处理; 当我们到了B部门的时候,又被告知这件事情已经移交给了C部门处理; ...

JackieRiver
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部