码迷,mamicode.com
首页 > 其他好文 > 详细

struts2实现防止表单重复提交

时间:2014-11-04 17:36:30      阅读:153      评论:0      收藏:0      [点我收藏+]

标签: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= 您已经提交了表单,请不要重复提交。 


struts2实现防止表单重复提交

标签:struts2   表单重复提交   

原文地址:http://blog.csdn.net/m631521383/article/details/40784755

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!