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页面了。