Struts2 <s:token/>标签<转>

本文介绍如何使用Struts2的&lt;s:token/&gt;标签及token拦截器防止表单重复提交。通过在JSP页面加入&lt;s:token/&gt;标签生成唯一标识并存入session,在配置文件中启用token拦截器验证该标识。
Struts2 <s:token/>标签
转自“http://noknower.iteye.com/blog/271796”
关键字: struts2 <s:token/>标签
1、使用Struts2的表单标签,其中需要增加token标签。如下:
……
Java代码

1. <%@ taglib uri="/struts-tags" prefix="s" %>
2. ……
3. <s:form action="page1" theme="simple">
4. <s:datetimepicker name="order.date" label="购买日期" toggleType="explode" value="today"/><br/>
5. <s:token/>
6. <s:reset/><s:submit/>
7. </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代码

1. <?xml version="1.0" encoding="UTF-8"?>
2. <!DOCTYPE struts PUBLIC
3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4. "http://struts.apache.org/dtds/struts-2.0.dtd">
5. <struts>
6.
7. <package name="lee" extends="struts-default">
8. <action name="page1" class="org.bruce.Page1">
9. <interceptor-ref name="defaultStack" />
10. <interceptor-ref name="token" />
11. <result>/page1.jsp</result>
12. <result name="invalid.token">/page1error.jsp</result>
13. </action>
14. </package>
15. </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对应的方法也不会执行
<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、付费专栏及课程。

余额充值