struts2实现防止表单重复提交

来源:互联网 发布:淘宝怎么写标题 编辑:程序博客网 时间:2024/06/06 10:38

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


0 0