token标签输出两个隐藏的表单字段,用于防止表单的重复提交。要让token标签正常工作,需要启用TokenInterceptor或者TokenSessionInterceptor拦截器。
配置一:(需要配置的部分使用红色字体进行了标注)
1、 首先需要启用token,需要在struts.xml中进行配置token的拦截器:
如在login的action中:
<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是指当表单被重复提交后,跳转到该页面。
然后还需要配置两个拦截器:分别是defaultStack和token
这样这个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页面了。