struts2 <s:token/>标签

本文介绍如何在Struts2中使用token标签和拦截器防止表单重复提交。通过在表单中添加token标签生成唯一标识符并在配置文件中启用token拦截器来实现。若表单重复提交,则跳转到指定页面并显示错误信息。
1、使用Struts2的表单标签,其中需要增加token标签。如下:
……
Java代码
<%@ taglib uri="/struts-tags" prefix="s" %>
……
<s:form action="page1" theme="simple">
<s:datetimepicker name="order.date" label="购买日期" toggleType="explode" value="today"/><br/>
<s:token/>
<s:reset/><s:submit/>
</s:form>

<%@ taglib uri="/struts-tags" prefix="s" %>
……
<s:form action="page1" theme="simple">
<s:datetimepicker name="order.date" label="购买日期" toggleType="explode" value="today"/><br/>
<s:token/>
<s:reset/><s:submit/>
</s:form>

2、在struts配置文件中增加token拦截器。如下:
Java代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

<package name="lee" extends="struts-default">
<action name="page1" class="org.bruce.Page1">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="token" />
<result>/page1.jsp</result>
<result name="invalid.token">/page1error.jsp</result>
</action>
</package>
</struts>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

<package name="lee" extends="struts-default">
<action name="page1" class="org.bruce.Page1">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="token" />
<result>/page1.jsp</result>
<result name="invalid.token">/page1error.jsp</result>
</action>
</package>
</struts>注意,需要name为invaid.token的result。这是当拦截器判断是重复提交的时候,会转向的结果。

3、invaid.token页面打印错误信息,一样可以使用struts标签。如下:
<s:actionerror/>

理解:
1、JSP使用<s:token/>标签的时候,Struts2会建立一个GUID(全局唯一的字符串)放在session中,并且会成为一个hidden放在form中。
2、token拦截器会判断客户端form提交的token和session中保存的session是否equals。如果equals则执行Action。否则拦截器直接返回invaid.token结果,Action对应的方法也不会执行

---------------------------------------------------------------------------------
对于采用token防止表单重复提交的原理我就不用多说了,大家也应该都知道,在这我只介绍在struts2中如何利用标签实现防止表单的重复提交。   

  首先在表单中加入标签 ,会生成一个隐藏域用于存储系统自动随机生成的token值。然后在action中启用TokenInterceptor,即在struts.xml中加入下面类似代码。
Java代码

1. <action name="register" class="UserAction" method="register">
2. <result>register_success.jsp</result>
3. <result name="input">register.jsp</result>
4. <result name="invalid.token">register.jsp</result>
5. <interceptor-ref name="token"></interceptor-ref>
6. <interceptor-ref name="defaultStack"></interceptor-ref>
7. </action>

<action name="register" class="UserAction" method="register">
<result>register_success.jsp</result>
<result name="input">register.jsp</result>
<result name="invalid.token">register.jsp</result>
<interceptor-ref name="token"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>

其中<result name="invalid.token">register.jsp</result>”是在发生表单重复提交时,返回给用户提示信息的显示页面,同时还需在显示页面中加入 ;“<interceptor-ref name="token"></interceptor-ref>”是启用TokenInterceptor 如果表单重复提交,会提示The form has already been processed or no token was supplied, please try again。修改国际化文件struts.messages.invalid.token 的键值,提供自己定制的错误信息。比如:struts.messages.invalid.token= 您已经提交了表单,请不要重复提交。
<table width="100%" border="" cellspacing="" cellpadding="@"> 2626 <tr align="center"> 263 2649 265e 266 267 268 269 270 271 272 73 274 275 276 277 278 279 280 281 282 2839 284 285 286 287 288 289 ,98 291 292 293 294 295 296 297 <logic:equal parameter="actionType" value="view"> <td class="white"> type="button" <input value="<bean:message key="prompt.common.return"/>' onclick="javascript:history.back();" class="button"> </td> </logic:equal> <logic:notEqual parameter="actionType" value="view"> <td class="white"> type="submit' <input value="<bean:message key="prompt.common.save" />" id="saveBtn" disabled="disabled" onclick="return validateBeforeSave();" class="button' </td> <td class="white"> <input type="button" value="<bean:message key="prompt.common.cancel"/>" onclick="returnList();" class="button"> </td> <td class="white"> <input type="button" value="<bean:message key="prompt.common.audit"/>' onclick="auditUser(); c1ass-"hutton"s </td> </logic:notEqual> </tr> </table> var hasAudited =false; 308 309 310 311 312 313 314 function auditUser(){ return false; if(!checkRcUsercode()) if(!checkRcUserName())return false: if(!checkRcFlag())return false; 315 31曖謓绶炝 317 318 319 320 321 322 323 324 325 alert("审核通过!现在可以保存了。"); hasAudited =true; var saveBtn= document.getElementById("saveBtn"); if(saveBtn){ saveBtn.disabled=false; saveBtn.style.opacity="1"; return true, 326 327 328 329 330 331 332 333 334 335 336 337 338 839 function validateBeforeSave(){ if(!hasAudited){ alert("请先点击'审核'按钮!"); return false; if(!checkRcUsercode())return false: if(!checkRcUserName())return false; if(!checkRcFlag())return false; return submitFormToSave(fm,''.'');} 本来想加个审核的按钮,想在保存前得先点击审核才能保存,但是审核点击不了,保存也点击不了,想问一下帮我看看哪个有点问题
最新发布
10-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值