关于struts2防止表单重复提交
struts2防表单重复提交有两种方式。
其一是action的重定向,跳转时设置type为从一个action跳转到另一个action或者另一个页面,
使用户提交后,所停留的位置,不是当前处理数据的Action,这样用户再刷新时,就不会再次执行这个Action了,
就会避免表单重复提交的问题了。
其二就是session令牌的方式(token)
处理也很方便,只需要在所提交的表单上加一个struts2标签 <s:token>
注意在该页面需要导入 <%@taglib prefix="s" uri="/struts-tags"%>
这样,当浏览器第一次访问这个带有<s:token>标签的页面时,在服务器中,解析<s:token>标签的类(TokenTag.class),
会生成一个随机的字符串(这个字符串,查看网页的源代码可以看到),并且发送给客户端的浏览器,同时,在服务器中,
会把这个随机字符串保存到用户的session对象中。
当第一次提交表单时,在服务器中,会比较客户端和服务器中分别保存的这个随机字符串,因为是第一次提交,
所以这两个字符串相等,然后进行正常的业务处理。第一次提交后,在服务器中的session中保存的这个随机字符串,
会改变为其他的随机值,注意,这是很重要的一步!此时,地址栏停留在处理用户提交数据的Action中,
客户端中保存的随机字符串没有改变,若是刷新页面,即重复提交,服务器再进行两个字符串的比较,
会不相等,就会跳转到name为invalid.token的结果页面中,这样就会防止表单重复提交了。
贴上示例代码
struts_regist.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
Created by IntelliJ IDEA.
User: leslie
Date: 17-12-2
Time: 上午10:46
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/struts_regist" method="post">
<s:token />
用户名:<input type="text" name="name"><br>
密 码:<input type="password" name="password"><br>
<input type="submit" value="注册">
</form>
</body>
</html>
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="default" namespace="/" extends="struts-default">
<action name="regist" class="cn.itcast.action.RegistAction">
<result name="invalid.token">/token.jsp</result>
<interceptor-ref name="token" />
<interceptor-ref name="defaultStack" />
</action>
</package>
</struts>
token.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head> <body>
<s:actionerror/>
</body>
</html>
RegistAction
package com.emuii.action; import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext; public class RegistAction extends ActionSupport { @Override
public String execute() throws Exception { String name = ServletActionContext.getRequest().getParameter("name");
String password = ServletActionContext.getRequest().getParameter("password"); System.out.println(name+":"+password+"已注册"); return null;
}
}
如果想要自定义错误信息,只需在action同一目录下创建一个 ----类名.properties配置文件即可
RegistAction.properties
struts.messages.invalid.token=\u60A8\u5DF2\u7ECF\u91CD\u590D\u63D0\u4EA4\u8868\u5355\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5
另:对于只有一个action来说,通配符跳转的方式第一种防表单提交无效的,虽然重定向之后的jsp页面不一样。
如果需要对特定的方法进行防表单提交这样:
<action name="someAction" class="com.examples.SomeAction">
<interceptor-ref name="token">
<param name="includeMethods">myMethod</param>
</interceptor-ref name="token"/>
<interceptor-ref name="basicStack"/>
<result name="success">good_result.ftl</result>
</action>
<param name="includeMethod">xx</param>表示只拦截xx方法
<param name="excludeMethod">xx</param>表示拦截xx方法之外的方法
另:WARN [org.apache.struts2.util.TokenHelper] - Could not find token name in params.出现这个问题,
也有可能是你没对指定方法进行拦截,当然情况不一定非是这种的,只是因为我的项目问题才导致这个问题的。
关于struts2防止表单重复提交的更多相关文章
- Struts2防止表单重复提交
1.说明 系统拦截器的应用. 表单重复提交:当使用请求转化进行跳转的时候,存在着表单重复提交的问题. 2.在表单中加入s:token 如果页面加入了struts2的标签,页面的请求必须进入struts ...
- 【转】Struts2解决表单重复提交问题
用户重复提交表单在某些场合将会造成非常严重的后果.例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消费了多次.因此,重复提 ...
- Struts2 处理表单重复提交
* 在表单页面中增加一个隐藏域:<s:token></s:token>(需要在表单内) * 创建一个struts.xml的配置文件,具体配置如下: ...
- Struts2基础学习(八)—Struts2防止表单重复提交
一.原因 用户重复提交表单在某些场合将会造成非常严重的后果.例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太 慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消 ...
- struts2防止表单重复提交的解决方案
一.造成重复提交主要的两个原因: 在平时的开发过程中,经常可以遇到表单重复提交的问题,如做一个注册页面,如果表单重复提交,那么一个用户就会注册多次,重复提交主要由于两种原因. 1. 一是,服务器 ...
- struts2 防止表单重复提交--令牌机制
jsp: action: 配置文件:
- 12、Struts2表单重复提交
什么是表单重复提交 表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交. 在不刷新表单页面的前提下: 多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 &qu ...
- Struts2第十三篇【防止表单重复提交】
回顾防止表单重复提交 当我们学习Session的时候已经通过Session来编写了一个防止表单重复提交的小程序了,我们来回顾一下我们当时是怎么做的: 在Servlet上生成独一无二的token,保存在 ...
- [原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- Floyed(floyd)算法详解
是真懂还是假懂? Floyed算法:是最短路径算法可以说是最慢的一个. 原理:O(n^3)的for循环,对每一个中间节点k做松弛(寻找更短路径): 但它适合算多源最短路径,即任意两点间的距离. 但sp ...
- 如何在python中使用chromedriver
下载对应版本的chromedriver,不知道版本的请参考:https://stackoverflow.com/a/55266105/11128312 接下来将下载的chromedriver.exe放 ...
- 【BZOJ1016】【Luogu P4208】 [JSOI2008]最小生成树计数 最小生成树,矩阵树定理
蛮不错的一道题,遗憾就遗憾在数据范围会导致暴力轻松跑过. 最小生成树的两个性质: 不同的最小生成树,相同权值使用的边数一定相同. 不同的最小生成树,将其都去掉同一个权值的所有边,其连通性一致. 这样我 ...
- vue cli3.0快速搭建项目详解(强烈推荐)
这篇文章主要介绍下vue-cli3.0项目搭建,项目结构和配置等整理一下,分享给大家. 一.介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.有三个组件: CLI:@vue/cl ...
- spring-data-mongodb两种实现方式对比
spring-data-mongodb两种实现方式对比 参考链接:https://blog.csdn.net/feinifi/article/details/83752862
- robotframework 找出重复元素
思路 一.把需要进行比较的元素取出来组装成一个list 二.利用python函数,从list中找出重复函数 python函数: from collections import Counter #引入C ...
- netfromwork4.5 迁移到netcore 遇到踩坑
https://weblogs.asp.net/ricardoperes/using-mef-in-net-core 可以用https://www.bbsmax.com/A/xl56bpv45r/ 里 ...
- jquery设置css属性几种方式
用css()方法返回元素的样式属性 $("div").css("padding-left")); 用css()设置样式 $("div").c ...
- 2018 焦作网络赛 L Poor God Water ( AC自动机构造矩阵、BM求线性递推、手动构造矩阵、矩阵快速幂 )
题目链接 题意 : 实际上可以转化一下题意 要求求出用三个不同元素的字符集例如 { 'A' .'B' .'C' } 构造出长度为 n 且不包含 AAA.BBB CCC.ACB BCA.CAC CBC ...
- Codeforces 622F The Sum of the k-th Powers ( 自然数幂和、拉格朗日插值法 )
题目链接 题意 : 就是让你求个自然数幂和.最高次可达 1e6 .求和上限是 1e9 分析 : 题目给出了最高次 k = 1.2.3 时候的自然数幂和求和公式 可以发现求和公式的最高次都是 k+1 ...