什么是表单重复提交
表单重复提交包括以下几种情况:
前提:不刷新表单页面
1、多次点击“提交”按钮后,重复提交了多次;
2、已经提交成功之后,按“回退”按钮之后,在点击“提交”按钮后,提交成功;
3、在控制页面响应的形式为“转发”的情况下,若已经提交成功,然后点击“刷新(F5)”按钮后,再次提交成功。
哪些操作不属于重复提交操作?
1、若刷新了表单页面,再提交表单不算重复提交;
2、若使用的是redirect的响应类型,已经提交成功后,在点击“刷新(F5)”按钮,不是表单的重复提交操作。
struts2使用token或tokenSession防止表单重复提交
第一步:需要再表单s:from中添加一个s:token子标签
1、添加了s:token子标签之后,会在页面中自动生成一个隐藏域;
2、在session中会添加一个属性值;
3、页面隐藏域的值与session的属性值是一致的。
<s:form action="testToken">
<s:token></s:token>
<s:textfield name="username" label="UserName"></s:textfield>
<s:password name="password" label="Password"></s:password>
<s:submit label="Submit"></s:submit>
</s:form>
第二步:使用token或者tokenSession拦截器
1、这两个拦截器都不在默认拦截器栈中,所以在使用时需要在页面手动配置;
2、如果使用token拦截器,需要配置一个名字为invalid.token的result;
<action name="testToken" class="com.dx.struts2.actions.MemberAction">
<interceptor-ref name="token"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result>/success.jsp</result>
<result name="invalid.token">/tokenError.jsp</result>
</action>
3、如果使用tokenSession拦截器,不需要配置任何额外的result。
<action name="testToken" class="com.dx.struts2.actions.MemberAction">
<interceptor-ref name="tokenSession"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result>/success.jsp</result>
</action>
备注:
token与tokenSession的区别
1)相同点:都是为解决struts2中防止表单重复提交而生;
2)不同点:使用token拦截器,如果发生重复提交时,页面会自动跳转到invalid.token的这个result页面;使用tokenSession拦截器时,依然会响应目标页面,但不会执行tokenSession之后的拦截器,就像什么都没有发生一样。
针对token方式,我们可以在tokenError.jsp页面接收操作信息,使用s:actionerror标签
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!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>
Token Error
<s:actionerror />
</body>
</html>
而且,我们也可以在国际化文件中配置对应的操作信息。
修改struts.xml添加constant变量:
<constant name="struts.custom.i18n.resources" value="i18n"></constant>
在i18n.properties文件添加国际化信息:
struts.messages.invalid.token=~~The form has already been processed or no token was supplied, please try again.
#jar struts-core.jar
#package org.apache.struts2
#filename struts-message.properties