表单的重复提交一直都是一个比较困扰人的问题,下面是struts2采用Token令牌的方式的来避免重复提交。
有表单的页面,也就是将要提交表单的那个页面,需用struts2自己的标签,要使用struts2的标签,当然是要在jsp文件的开头加上:
<%@ taglib prefix="s" uri="/struts-tags" %>
然后就可以用他的标签了、
现在以一个最基本的表单来示范:
<s:form action="token" theme="simple">
username:<s:textfield name="username"></s:textfield><br/>
password:<s:password name="password"></s:password><br/>
<s:token></s:token>
<s:submit></s:submit>
</s:form>
注意上面的表单,为一个亮点就是多加了<s:token></s:token>这个标签。这就是struts2封装好了的,查看他的源代码可以看到:
<form id="token" name="token" action="/strut2_302_token/token.action;jsessionid=946434B84A81E5B277DC0DE907204923" method="post">
username:<input type="text" name="username" value="" id="token_username"/>
<br/>
password:<input type="password" name="password" id="token_password"/><br/>
<input type="hidden" name="struts.token.name" value="struts.token" />
<input type="hidden" name="struts.token" value="33T962IU08J88WEQWZ9WMSNXWYCQU11P" />
<input type="submit" id="token_0" value="Submit"/>
</form>
呵呵,有多了个隐藏域、这应该就是重点了。我们不妨假设,struts2这个<s:token></s:token>的原理,应该就和那个value随机数有关。
接下来,为了测试,新建两个jsp页面。
刚刚提交时,转到tokenSuccess.jsp。
假设表单重复提交,则转到:tokenFail.jsp。
然后,最重要的一步:(当然还是我们struts2的核心配置文件struts.xml文件了)
<package name="login" extends="struts-default" namespace="/">
<action name="token" class="com.guang.struts2.token">
<result name="success">/tokenSuccess.jsp</result>
<result name="invalid.token">/tokenFail.jsp</result>
<interceptor-ref name="token"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
注意上面的代码,较平时多出了两句:
<interceptor-ref name="token"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
这个是struts2的拦截器、
java文件没有什么特殊的,随便的生成get,set方法。再在execute方法中return SUCCESS; 即可了。