Struts(二十七):使用token或tokenSession防止表单重复提交

  • 什么是表单重复提交

表单重复提交包括以下几种情况:

  前提:不刷新表单页面

  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
原文地址:https://www.cnblogs.com/yy3b2007com/p/6699185.html