`

struts2 避免重复提交的token 的用法

阅读更多
1、使用Struts2的表单标签,其中需要增加token标签。如下:
……
<%@ 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拦截器。(token 和 token-session 拦截器的启用,是在 struts.xml 配置文件中,既可以为包启用,也可以单独为某个 action 启用)
2.1  为 Action 启用 token
<?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>

2.2 为包启用 token

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

</package>


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对应的方法也不会执行

PS:根据笔者经验,要做的完美,还应该添加如下
<result name="input" type="freemarker">
   /WEB-INF/ftl/nt/new_story_post.ftl
</result>
这个是如果出错,返回的提示页,一般返回原来的页

另外,如果用户(一般指比较有“技术”的用户,嘿嘿)直接访问表单的action,也就是处理用户提交内容的action,这个ACTION也是配置了token的action,这个invalid.token视图,也应该指向该表单页面。例如
<result name="invalid.token" type="freemarker">
/WEB-INF/ftl/nt/new_story_post.ftl(这个就是表单页)
</result>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics