Struts2提供token关键字,可以防止表单的重复提交

token标签输出两个隐藏的表单字段,用于防止表单的重复提交。要让token标签正常工作,需要启用TokenInterceptor或者TokenSessionInterceptor拦截器。

 

 

配置一:(需要配置的部分使用红色字体进行了标注)

 

1、  首先需要启用token,需要在struts.xml中进行配置token的拦截器:

 

如在loginaction中:

 

        <action name="login" class="LoginAction">
            <result name="success" type="redirect">/mainpage.action</result>
            <result name="input">/index.jsp</result>
            <result name="invalid.token">/token.jsp</result>
            <interceptor-ref name="defaultStack" />   
            <interceptor-ref name="token" /> 
        </action>

 

 

配置的invalid.token是指当表单被重复提交后,跳转到该页面。

 

然后还需要配置两个拦截器:分别是defaultStacktoken

 

这样这个token就启动了。

 

2、启动token后,我们需要在页面中表单的部分添加<token/>标签

 

<s:form action="login" id="form1">
    <s:textfield name="login.loginName" label="%{getText('loginNameOrEmail')}" id="loginName"></s:textfield>
    <div style="float: left;" id="div21"><font color="aqua"><s:text name="loginUsernamePrompt"></s:text></font> </div>
    <s:password name="login.loginPwd" label="%{getText('loginPwd')}" id="loginPwd" size="22"></s:password>             
    <div style="float: left;" id="div22"><font color="aqua"><s:text name="loginPasswordPrompt"></s:text></font> </div>
<s:token />
</s:form>

 

  

 

3、然后我们再新建一个token.jsp页面,用于重复提交后跳转到该界面,提示用户不要进行重复提交。

token.jsp:

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!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
</body>
</html>

 

 

4、这样我们在登录界面,填写上用户名和密码后,如果提交过了表单,然后用重新提交这个表单的时候,如在表单页面进行刷新,就会自动跳转到token.jsp页面了。就是防止了表单的重复提交。

 

 

 

 

 

配置二:

上面在启动token的时候,我们是在action中进行配置的。我们也可以为整个package配置token

 

    <package name="facePot" extends="struts-default">
        <interceptors>
            <interceptor-stack name ="myStack">
               <interceptor-ref name ="token"/>
                <interceptor-ref name ="defaultStack"/>
            </interceptor-stack>
        </interceptors>

        <default-interceptor-ref name ="myStack"/>  
        <action name="login" class="LoginAction">
            <result name="success" type="redirect">/mainpage.action</result>
            <result name="input">/index.jsp</result>
            <result name="invalid.token">/token.jsp</result>
        </action>
    </package>

 

 

这样就会为这个包下的所有action都配置上这个token。然后在界面中使用也是一样的,只需加上<token/>标签即可。

 

<s:form action="login" id="form1">
    <s:textfield name="login.loginName" label="%{getText('loginNameOrEmail')}" id="loginName"></s:textfield>
    <div style="float: left;" id="div21"><font color="aqua"><s:text name="loginUsernamePrompt"></s:text></font> </div>
    <s:password name="login.loginPwd" label="%{getText('loginPwd')}" id="loginPwd" size="22"></s:password>             
    <div style="float: left;" id="div22"><font color="aqua"><s:text name="loginPasswordPrompt"></s:text></font> </div>
<s:token />
</s:form>

 

 

当我们重复提交这个登陆表单的时候,就会跳转到token.jsp页面了。

 

你可能感兴趣的:(struts2,防止,表单重复提交,提token)