1.什么是表单重复提交

> 在不刷新表单页面的前提下:
        >> 多次点击提交按钮
        >> 已经提交成功, 按 "回退" 之后, 再点击 "提交按钮".
        >> 在控制器响应页面的形式为转发情况下,若已经提交成功, 然后点击 "刷新(F5)"

> 注意:
        >> 若刷新表单页面, 再提交表单不算重复提交
        >> 若使用的是 redirect 的响应类型(地址栏发生变化), 已经提交成功后, 再点击 "刷新", 不是表单的重复提交

2.Struts解决表单重复提交问题

I. 在表单中添加 s:token 子标签

> 生成一个隐藏域
    > 在 session 添加一个属性值
    > 隐藏域的值和 session 的属性值是一致的可以提交,否则认为是重复提交.
    
II. 使用 Token 或 TokenSession 拦截器.

> 这两个拦截器均不在默认的拦截器栈中, 所以需要手工配置一下
    > 若使用 Token 拦截器, 则需要配置一个 token.valid 的 result
    > 若使用 TokenSession 拦截器, 则不需要配置任何其它的 result
    
III. Token VS TokenSession

> 都是解决表单重复提交问题的
    > 使用 token 拦截器会转到 token.valid 这个 result
    > 使用 tokenSession 拦截器则还会响应那个目标页面, 但不会执行 tokenSession 的后续拦截器. 就像什么都没发生过一样!
    
IV. 可以使用 s:actionerror 标签来显示重复提交的错误消息.
该错误消息可以在国际化资源文件中覆盖. 该消息可以在 struts-messages.properties 文件中找到

3.token解决表单重复提交问题(可以跳转到指定页面显示指定消息)

1.Action同正常的Action一样

 package FormRepeat;
import com.opensymphony.xwork2.ActionSupport;
public class FormRepeatSub extends ActionSupport {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String execute() throws Exception {
Thread.sleep(2000);
System.out.println(username);
return super.execute();
}
}

 2.JSP表单页面(表单中插入<s:token>)

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/Struts2FileUpload/formRepeatSub.action" method="post">
<s:token></s:token>
username:<input type="text" name="username">
<br/>
<input type="submit" value="提交">
</form>
</body>
</html>

错误处理页面 TokenError.jsp

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@taglib uri="/struts-tags" prefix="s" %>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
5 <html>
6 <head>
7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
8 <title>Insert title here</title>
9 </head>
10 <body>
11 <!-- 用于struts排错,看出什么类型错误 -->
12 <s:debug></s:debug>
13 <!-- 显示错误的消息 -->
14 <s:actionerror/>
15 </body>
16 </html>

 3.Struts的配置

 <?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> <!-- <constant name="struts.devMode" value="true"></constant> -->
<package name="test2" extends="struts-default">
<action name="formRepeatSub" class="FormRepeat.FormRepeatSub">
<!-- 使用token拦截器 -->
<interceptor-ref name="token"></interceptor-ref>
<!-- 使用系统默认拦截 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 正常提交跳转的页面 -->
<result>/message.jsp</result>
<!-- 重复提交后跳转的页面 -->
<result name="invalid.token">/TokenError.jsp</result>
</action>
</package>
</struts>

国际化资源文件:

aaarticlea/png;base64,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" alt="" />

测试:

aaarticlea/png;base64,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" alt="" />

总结:

    使用token的防止表单提交在form表单的开头添加一个token,添加后可以在页面查看源码生成一个随机的value值。根据session的进行匹配,每次都产生一个随机值,相同可以提交,不同就认为是重复提交。在action配置的时候添加token拦截器,需要配置一个 token.valid 的 result,结果转发到页面出错的页面。如下

aaarticlea/png;base64,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" alt="" />

在页面出错的页面(TokenError.jsp),获取出错消息(前提是导入struts标签<%@taglib uri="/struts-tags" prefix="s" %>)

aaarticlea/png;base64,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" alt="" />

页面出错的消息可以在国际化资源文件(i18n.properties)中设置, 该消息可以在 struts-messages.properties 文件中找到并修改

struts.messages.invalid.token=^^The form has already been processed or no token was supplied, please try again.

测试:

  (1)正常可以跳转

  (2)提交后后退:

提交前:

aaarticlea/png;base64,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" alt="" />

提交后后退:

aaarticlea/png;base64,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" alt="" />

  (3)刷新也是重复提交

4.tokenSession解决表单重复提交问题(还会响应那个目标页面, 但不会执行 tokenSession 的后续拦截器. 就像什么都没发生过一样!)

只需要修改一下Ation配置,将拦截器设置为tokenSession ,重复提交后不会出提示,但数据只提交一次。

      <action name="formRepeatSub" class="FormRepeat.FormRepeatSub">
<!-- 改为tokenSession拦截器,这个一般放在前面。出错后不会执行后续拦截器,提高性能 -->
<interceptor-ref name="tokenSession"></interceptor-ref>
<!-- 使用默认拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 跳转的页面,不会做处理,相当于只提交一次 -->
<result>/message.jsp</result>
</action>

页面插入一个<s:token></s:token>

 <form action="/Struts2FileUpload/formRepeatSub.action" method="post">
<s:token></s:token>
username:<input type="text" name="username">
<br/>
<input type="submit" value="提交">
</form>

这个多次点也提交一次,也不会跳转,也不会给出提示,使用简单。只需要在表单第一个元素添加一个<s:token></s:token>,然后配置一下拦截器。

查看TokenSession源码:

  大概是进来之后首先调用handleToken()判断session中是否有id为token值的token,没有就调用handleValidToken()获取到token的name与值并存入map缓存起来,如果有就走handleInvalidToken()终止方法的执行。

/*
* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/ package org.apache.struts2.interceptor; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.util.ValueStack;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.util.InvocationSessionStore;
import org.apache.struts2.util.TokenHelper; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Map; /**
* <!-- START SNIPPET: description -->
*
* This interceptor builds off of the {@link TokenInterceptor}, providing advanced logic for handling invalid tokens.
* Unlike the normal token interceptor, this interceptor will attempt to provide intelligent fail-over in the event of
* multiple requests using the same session. That is, it will block subsequent requests until the first request is
* complete, and then instead of returning the <i>invalid.token</i> code, it will attempt to display the same response
* that the original, valid action invocation would have displayed if no multiple requests were submitted in the first
* place.
*
* <p/>
*
* <b>NOTE:</b> As this method extends off MethodFilterInterceptor, it is capable of
* deciding if it is applicable only to selective methods in the action class. See
* <code>MethodFilterInterceptor</code> for more info.
*
* <!-- END SNIPPET: description -->
*
* <p/> <u>Interceptor parameters:</u>
*
* <!-- START SNIPPET: parameters -->
*
* <ul>
*
* <li>None</li>
*
* </ul>
*
* <!-- END SNIPPET: parameters -->
*
* <p/> <u>Extending the interceptor:</u>
*
* <p/>
*
* <!-- START SNIPPET: extending -->
*
* There are no known extension points for this interceptor.
*
* <!-- END SNIPPET: extending -->
*
* <p/> <u>Example code:</u>
*
* <pre>
* <!-- START SNIPPET: example -->
*
* &lt;action name="someAction" class="com.examples.SomeAction"&gt;
* &lt;interceptor-ref name="tokenSession/&gt;
* &lt;interceptor-ref name="basicStack"/&gt;
* &lt;result name="success"&gt;good_result.ftl&lt;/result&gt;
* &lt;/action&gt;
*
* &lt;-- In this case, myMethod of the action class will not
* get checked for invalidity of token --&gt;
* &lt;action name="someAction" class="com.examples.SomeAction"&gt;
* &lt;interceptor-ref name="tokenSession&gt;
* &lt;param name="excludeMethods"&gt;myMethod&lt;/param&gt;
* &lt;/interceptor-ref name="tokenSession&gt;
* &lt;interceptor-ref name="basicStack"/&gt;
* &lt;result name="success"&gt;good_result.ftl&lt;/result&gt;
* &lt;/action&gt;
*
* <!-- END SNIPPET: example -->
* </pre>
*
*/
public class TokenSessionStoreInterceptor extends TokenInterceptor { private static final long serialVersionUID = -9032347965469098195L; @Override
protected String handleToken(ActionInvocation invocation) throws Exception {
//see WW-2902: we need to use the real HttpSession here, as opposed to the map
//that wraps the session, because a new wrap is created on every request
HttpSession session = ServletActionContext.getRequest().getSession(true);
synchronized (session.getId().intern()) {
if (!TokenHelper.validToken()) {
return handleInvalidToken(invocation);
}
return handleValidToken(invocation);
}
} @Override
protected String handleInvalidToken(ActionInvocation invocation) throws Exception {
ActionContext ac = invocation.getInvocationContext(); HttpServletRequest request = (HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);
HttpServletResponse response = (HttpServletResponse) ac.get(ServletActionContext.HTTP_RESPONSE);
String tokenName = TokenHelper.getTokenName();
String token = TokenHelper.getToken(tokenName); if ((tokenName != null) && (token != null)) {
Map params = ac.getParameters();
params.remove(tokenName);
params.remove(TokenHelper.TOKEN_NAME_FIELD); String sessionTokenName = TokenHelper.buildTokenSessionAttributeName(tokenName);
ActionInvocation savedInvocation = InvocationSessionStore.loadInvocation(sessionTokenName, token); if (savedInvocation != null) {
// set the valuestack to the request scope
ValueStack stack = savedInvocation.getStack();
request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, stack); ActionContext savedContext = savedInvocation.getInvocationContext();
savedContext.getContextMap().put(ServletActionContext.HTTP_REQUEST, request);
savedContext.getContextMap().put(ServletActionContext.HTTP_RESPONSE, response);
Result result = savedInvocation.getResult(); if ((result != null) && (savedInvocation.getProxy().getExecuteResult())) {
result.execute(savedInvocation);
} // turn off execution of this invocations result
invocation.getProxy().setExecuteResult(false); return savedInvocation.getResultCode();
}
} return INVALID_TOKEN_CODE;
} @Override
protected String handleValidToken(ActionInvocation invocation) throws Exception {
// we know the token name and token must be there
String key = TokenHelper.getTokenName();
String token = TokenHelper.getToken(key);
String sessionTokenName = TokenHelper.buildTokenSessionAttributeName(key);
InvocationSessionStore.storeInvocation(sessionTokenName, token, invocation); return invocation.invoke();
} }

@Override
    protected String handleToken(ActionInvocation invocation) throws Exception {
        //see WW-2902: we need to use the real HttpSession here, as opposed to the map
        //that wraps the session, because a new wrap is created on every request
        HttpSession session = ServletActionContext.getRequest().getSession(true);
        synchronized (session.getId().intern()) {
            if (!TokenHelper.validToken()) {
                return handleInvalidToken(invocation);
            }
            return handleValidToken(invocation);
        }
    }

Struts防止表单重复提交的更多相关文章

  1. 1.struts 防止表单重复提交 2. 拦截器

    1. 使用struts 防止表单提交 时, form 表单必须使用struts标签库编写,如<s:form/> 等,而不是html标签 2. 拦截器是struts2的核心.  interc ...

  2. 使用Struts 2防止表单重复提交

    用户重复提交表单在某些场合将会造成非常严重的后果.例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消费了多次.因此,重复提 ...

  3. struts2视频学习笔记 29-30(Struts 2常用标签,防止表单重复提交)

    课时28 Struts 2常用标签解说 property标签 property标签用于输出指定值: <s:set name="name" value="'kk'&q ...

  4. Struts(二十七):使用token或tokenSession防止表单重复提交

    什么是表单重复提交 表单重复提交包括以下几种情况: 前提:不刷新表单页面 1.多次点击“提交”按钮后,重复提交了多次: 2.已经提交成功之后,按“回退”按钮之后,在点击“提交”按钮后,提交成功: 3. ...

  5. 一脸懵逼学习Struts数据校验以及数据回显,模型驱动,防止表单重复提交的应用。

    1:Struts2表单数据校验: (1)前台校验,也称之为客户端校验,主要是通过Javascript编程的方式进行数据的验证. (2)后台校验,也称之为服务器校验,这里指的是使用Struts2通过xm ...

  6. [转]使用Struts 2防止表单重复提交

    转自 用户重复提交表单在某些场合将会造成非常严重的后果.例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消费了多次.因此, ...

  7. 12、Struts2表单重复提交

    什么是表单重复提交 表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交. 在不刷新表单页面的前提下: 多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 &qu ...

  8. Struts2防止表单重复提交

    1.说明 系统拦截器的应用. 表单重复提交:当使用请求转化进行跳转的时候,存在着表单重复提交的问题. 2.在表单中加入s:token 如果页面加入了struts2的标签,页面的请求必须进入struts ...

  9. 【转】Struts2解决表单重复提交问题

    用户重复提交表单在某些场合将会造成非常严重的后果.例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消费了多次.因此,重复提 ...

随机推荐

  1. 自学Linux Shell17.1-正则表达式

    点击返回 自学Linux命令行与Shell脚本之路 17.1-正则表达式 1. 正则表达式概念 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“ ...

  2. 自学Zabbix8.1 Regular expressions 正则表达式

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix8.1 Regular expressions 正则表达式 1. 配置 点击Adm ...

  3. cf1063A Oh Those Palindromes (贪心)

    给一些字符 求它们能拼成的字符串 的回文子串的个数最大值 对应的那个字符串 就是把相同的都放一起是最优的,排下序就行了... #include<bits/stdc++.h> #define ...

  4. linux 用户及用户组管理

    主要分为以下三部分: 1. 用户账号的添加.修改及删除 2. 用户口令的管理 3. 用户组管理 用户管理 1.添加新用户账号 $ useradd 选项 用户名 选项: -c comment 指定一段注 ...

  5. SpringBoot集成RocketMQ

    实战,用案例来说话 前面已经说了JMS和RocketMQ一些概念和安装,下面使用SpringBoot来亲身操作一下. 生产者的操作 SpringBoot项目创建完成,引入依赖是第一步: <dep ...

  6. 【POJ3349】snowflakes

    这是一道可以练习哈希表的模板题.关于哈希表的操作均有涉及. 哈希函数的选取是这道题的关键.这道题的关键字是一个长度为6的序列,并且序列与开始顺序.时钟顺序均无关. 因此,采用哈希函数\(H[x]=\S ...

  7. PD915温度太高,通过设置BIOS降底CPU的核心电压来降温。

    由于对电脑配置不是很懂,去年去配了台电脑,用的CPU是PD915,不用不知道,一用吓一跳. PD915在冬天的时候,运行起来温度大概在30多度,感觉很正常. 可是一到了夏天,温度就升到了70到80度之 ...

  8. c# Bitmap byte[] Stream 文件相互转换

    //byte[] 转图片 publicstatic Bitmap BytesToBitmap(byte[] Bytes) { MemoryStream stream = null; try { str ...

  9. Selenium基于Python 进行 web 自动化测试

    配置使用环境 下载相应的浏览器驱动, Firefox 是默认的 本文以 chrome 为主 ,放在scripts目录下ChromeDriver 官方下载地址 : 所有版本的 ChromeDriver ...

  10. 第1课:SQL注入原理深度解析

    对于Web应用来说,注射式攻击由来已久,攻击方式也五花八门,常见的攻击方式有SQL注射.命令注射以及新近才出现的XPath注射等等.本文将以SQL注射为例,在源码级对其攻击原理进行深入的讲解. 一.注 ...