文档章节

表单重复提交处理总结

liuxw0226
 liuxw0226
发布于 2015/12/22 23:13
字数 954
阅读 153
收藏 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
(亿级流量)分布式防重复提交token设计

大型互联网项目中,很多流量都达到亿级。同一时间很多的人在使用,而每个用户提交表单的时候都可能会出现重复点击的情况,此时如果不做好控制,那么系统将会产生很多的数据重复的问题。怎样去...

小红牛
01/05
0
0
谈谈防止重复点击提交

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

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

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

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

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

Galy_绿
2015/12/01
100
0

没有更多内容

加载失败,请刷新页面

加载更多

lucene 评分要素解析

基本规则:

Java搬砖工程师
26分钟前
0
0
ubutnu 14.04 安装JIRA

系统版本:Ubuntu 14.04 下载jira安装文件 sudo wget https://downloads.atlassian.com/software/jira/downloads/atlassian-jira-software-7.1.9-x64.bin 修改文件权限 sudo chmod 777 atl......

Kampfer
36分钟前
0
0
软件开发模型优缺点及其适用范围

瀑布模型、快速原型模型、增量模型、螺旋模型 瀑布模型也称软件生存周期模型。 优点: (1)它在软件工程中占有重要地位,它提供了软件开发的基本框架,这比依靠“个人技艺”开发软件好得多。...

无极之岚
36分钟前
0
0
孩子们各显神通对付 iOS 12「屏幕使用时间」的限制

简评:2018 年秋季,苹果公司推出了 iOS 12,其中备受好评的一项改变是:增加了屏幕使用时间限制,以减轻沉迷手机的状况。三个月过去后,这项功能似乎并没有对孩子造成太多困扰,道高一尺魔高...

极光推送
41分钟前
2
1
springCloud Spring Boot mybatis分布式微服务云架构-docker-feign-hystrix-ribbon(七)

简介 在上一节中,我们讨论了feign+hystrix在项目开发中,除了考虑正常的调用之外,负载均衡和故障转移也是关注的重点,这也是feign + ribbon+hystrix的优势所在,本节我们就讨论一下在feign...

sccspuercode
42分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部