struts2实现防止表单重复提交

1.使用Struts2的表单标签,其中需要增加token标签。

<s:token/>标签其实底层是这么实现的:

首先会在form表单里产生一个hidden类型的<input>标签:

<input type="hidden" name="token" value="9AUOGRO10QB77EAJ65NYE6ROHWZ3IIQN" />

然后struts2会生成一个全局唯一的字符串token放置在session会话中。

表单提交时检查表单提交的token和session会话中的值是否相同,相同则执行action,执行完成之后会修改session中token的值。

否则会被拦截到

invalid.token结果中。因此还需在action中声明invalid.token结果视图。

如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
import="java.util.*"
    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>
	<s:form action="myAction" method="post" namespace="/">
		名字:<s:textfield name="name"></s:textfield><br>
		<s:token/>
		<s:submit value="提交"></s:submit>
	</s:form>
</body>
</html>

2.在struts配置文件中为action增加token拦截器。

这里需要注意一点:struts2中所有action默认使用defaultStack拦截器栈,struts2的很多功能都是依靠拦截器栈中的拦截器的支撑。

如果手动在aciton中添加拦截器,这时会导致acton丢失defaultStack拦截器栈,所有我们在手动添加拦截器的时候,还需要手动添加defaultStack拦截器栈

如下:

<?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="myAction" class="com.itheima.action.MyToken">
			<span style="color:#FF0000;"><interceptor-ref name="defaultStack"></interceptor-ref></span>
			<span style="color:#FF0000;"><interceptor-ref name="token"></interceptor-ref></span>
			<span style="color:#FF0000;"><result name="invalid.token">/index.jsp</result></span>
			<result>/success.jsp</result>
		</action>

    </package>

</struts>

3.我们可以通过<s:actionerror/>标签输出错误信息

<%@ page language="java" contentType="text/html; charset=utf-8"
import="java.util.*"
    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>
	<span style="color:#FF0000;"><s:actionerror/></span>
	<s:form action="myAction" method="post" namespace="/">
		名字:<s:textfield name="name"></s:textfield><br>
		<s:token/>
		<s:submit value="提交"></s:submit>
	</s:form>
</body>
</html>

因为显示的是英文,我们可以通过修改国际化文件struts.messages.invalid.token 的键值,提供自己定制的错误信息。比如:struts.messages.invalid.token= 您已经提交了表单,请不要重复提交。

时间: 2024-07-28 16:02:04

struts2实现防止表单重复提交的相关文章

Struts2中防止表单重复提交

一.防止表单的重复提交 1.在表单中加入<s:token/>标签 2.在动作类中加入token的拦截器<interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="token"></interceptor-ref> 3.增加一个名称为invalid.token的结果视图<result name="

struts2之防止表单重复提交

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

struts1与struts2的防止表单重复提交

struts1的防止表单重复提交 一.方法:利用令牌来解决页面重复提交的问题 二.步骤 2.1  Action中需要添加以下代码 public ActionForward entry(ActionMapping mapping, ActionForm form, HttpServletRequestrequest, HttpServletResponse response) throws Exception { saveToken(request); return mapping.findFor

【Struts2】防止表单重复提交

一.概述 二.Struts2中解决方案 三.实现步骤 一.概述 regist.jsp----->RegistServlet 表单重复提交 危害: 刷票. 重复注册.带来服务器访问压力(拒绝服务) 解决方案: 在页面上生成一个令牌(就是一个随机字符串),将其存储到session中,并在表单中携带. 在服务器端,获取数据时,也将令牌获取,将它与session中存储的token对比,没问题,将session中令牌删除. 二.Struts2中解决方案 struts2中怎样解决表单重复提交: 在strut

Struts2中解决表单重复提交

3. 表单的重复提交问题 1). 什么是表单的重复提交 > 在不刷新表单页面的前提下:  >> 多次点击提交按钮 >> 已经提交成功, 按 "回退" 之后, 再点击 "提交按钮". >> 在控制器响应页面的形式为转发情况下,若已经提交成功, 然后点击 "刷新(F5)" > 注意: >> 若刷新表单页面, 再提交表单不算重复提交 >> 若使用的是 redirect 的响应类型,

struts2如何防止表单重复提交

struts2解决表单重复提交问题方法: 1.在s:form 标签中加入s:token标签 1)会生成一个隐藏域, 2)在session中添加一个属性值 3)隐藏域中的值和session中的值是一样的 2.使用token拦截器或者是tokenSession拦截器 这两个拦截器不在默认的拦截器栈中,需要手工配置一下 使用token拦截器,需要配置一个invalid.token的result 使用tokenSession拦截器不用配置任何的result 3.token VS tokenSession

12-struts2防止表单重复提交

防止表单重复提交 问题:什么是表单重复提交? regist.jsp----->RegistServlet 表单重复提交 危害: 刷票. 重复注册.带来服务器访问压力(拒绝服务) 解决方案: 在页面上生成一个令牌(就是一个随机字符串),将其存储到session中,并在表单中携带. 在服务器端,获取数据时,也将令牌获取,将它与session中存储的token对比,没问题, 将session中令牌删除. struts2中怎样解决表单重复提交: 在struts2中解决表单重复提交,可以使用它定义的一个i

struts2 自带的 token防止表单重复提交拦截器

在struts2中,我们可以利用struts2自带的token拦截器轻松实现防止表单重复提交功能! 1. 在相应的action配置中增加:  <interceptor-ref name="token"></interceptor-ref> <result name="invalid.token">/error.jsp</result> 2. 增加error.jsp文件,代码如下:  <h1>禁止重复提交&l

[原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------