使用Token拦截器或者TokenSession拦截器
原理:当客户端请求页面时,让服务器生成一个唯一标记,并在服务器和表彰里各保存一份这个标记的副本。此后,在用户提交表彰的时候,表单里的标记将随着其他请求参数一起发送到服务器,服务器将对它收到的标记和它留存的标记进行比较,如果两者匹配,这次提交上来的表单则是有效的,服务器将对之做出必要的处理并重新设置一个标记。随后提交相同的表单就会失败,因为服务器上的标记已经重置。
15.1 标记管理
Token标签必须与Token TokenSession拦截器配合使用。在遇到重复提交的情况时,会返回“Invalid.token”结果并加上一个动作错误。出错消息为"The form has already been processed or no token was supplied, please try again."如果要修改默认消息,在配置文件中修改。TokenInterceptor.properties里面,位于/WEB-INF/classes/org/apache/struts2/intercetpor的子目录下。
struts.messages.invalid.token=You have submitted the form the second time.Please contact the administrator.
15.2 Token拦截器使用
动作申明:假如对pay_input动作使用该拦截器。
<package name="app15" extends="struts-default">
<action name="pay_input">
<result>/payment.jsp</result>
</action>
<action name="pay" class="app15.payment">
<interceptor-ref name="token" />
<interceptor-ref name="basicStack" />
<result name="invalid.token">/jsp/error.jsp</result>
<result name="input">/jsp/error.jsp</result>
<result>/jsp/thanks.jsp</result>
</action>
</package>
表单里面:
<s:form action="pay">
<s:token />
<s:textfield name="amount" label="amount" />
<s:submit />
</s:form>
15.3 Token Session拦截器
同Token拦截器。