`

自学Struts2的tokenInterceptor的想法(转载)

阅读更多
 
分类: Struts2 Java JavaScript 991人阅读 评论(4) 收藏 举报
[xml] view plaincopy
 
  1. 本文引用不少网上资料,如没写着引用出处,请原凉。  

先说说tokenInterceptor的作用,防止客户重复提交表单,可以解决,客户在同一表单中点击两个提交,后退后,再提交,在提交完成后,对跳转的页面直接进行刷新,避免两次写入数据库。都可以很好的解决。

先说说什么是拦截器,拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。上面这段话是Max说的。觉得不错,很清晰明了。

我先来举个例子,大家一看就会明白的

struts.xml

[xml] view plaincopy
 
  1. <!DOCTYPE struts PUBLIC   
  2.   
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.   
  5.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  6.   
  7. <struts>  
  8.   
  9.     <include file="struts-default.xml"/>  
  10.   
  11.     <package name="default" extends="struts-default">  
  12.   
  13.         <default-interceptor-ref name="paramsPrepareParamsStack"/>  
  14.   
  15.     </package>  
  16.   
  17.     <include file="strutsconfig/struts-workticket.xml" />  
  18.   
  19. </struts>  

struts-workticket.xml

[xml] view plaincopy
 
  1. <!DOCTYPE struts PUBLIC   
  2.   
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.   
  5.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  6.   
  7. <struts>  
  8.   
  9.   
  10.   
  11.     <package name="demo" extends="struts-default" namespace="/demo">   
  12.   
  13.        <!-- 错误提示页面 -->  
  14.   
  15.        <global-results>  
  16.   
  17.            <result name="error">/errInfo.jsp</result>  
  18.   
  19.        </global-results>  
  20.   
  21.        <global-exception-mappings>  
  22.   
  23.            <exception-mapping result="error" exception="java.lang.Throwable"/>  
  24.   
  25.        </global-exception-mappings>  
  26.   
  27.          
  28.   
  29.         <action name="tokenInterceptor_*" class="com.hz.struts2.demo.web.action.TokenInterceptorAction" method="{1}">    
  30.   
  31.   
  32.   
  33.             <result name="demo">/web/demo.jsp</result>  
  34.   
  35.             <result name="login">/index.jsp</result>  
  36.   
  37.             <!-- 注意:作用,如果出现重要提交的时候,跳转的页面  -->  
  38.   
  39.             <result name="invalid.token">/overPageInfo.jsp</result>  
  40.   
  41.             <!-- 注意:一定要写上,否则无法运行。原因:如果不写的话, 就不会调用默认的拦截器,因为被覆盖啦 -->   
  42.   
  43.             <interceptor-ref name="defaultStack" />  
  44.   
  45.             <interceptor-ref name="token">  
  46.   
  47.                 <!-- 在action中,需要进行拦截的方法  -->  
  48.   
  49.                 <param name="includeMethods">execute,checkLogin</param>  
  50.   
  51.                 <!-- 在action中,不需要进行拦截的方法  -->  
  52.   
  53.                 <param name="excludeMethods">toLogin</param>  
  54.   
  55.             </interceptor-ref>  
  56.   
  57.               
  58.   
  59.         </action>  
  60.   
  61.   
  62.   
  63.     </package>  
  64.   
  65. </struts>  

com.hz.struts2.demo.web.action.TokenInterceptorAction.java

[java] view plaincopy
 
  1. 这个没什么意思,不需要做任何改动,这就可以体现出拦截器的好出,大大减少啦代码量,提高了代码的复用性。  
[java] view plaincopy
 
  1. package com.hz.struts2.demo.web.action;  
  2.   
  3.   
  4.   
  5. public class TokenInterceptorAction extends AbstractAction {  
  6.   
  7.     @Override  
  8.   
  9.     public String execute() throws Exception {  
  10.   
  11.         System.out.println(" :: execute " + new java.util.Date());  
  12.   
  13.         return "demo";  
  14.   
  15.     }  
  16.   
  17.   
  18.   
  19.     /** 
  20.  
  21.      * Goto login page 
  22.  
  23.      */  
  24.   
  25.   
  26.   
  27.     public String toLogin() throws Exception {  
  28.   
  29.         System.out.println(" :: toLogin " + new java.util.Date());  
  30.   
  31.         //return "invalid.token";  
  32.   
  33.         return "login";  
  34.   
  35.     }  
  36.   
  37.   
  38.   
  39.     public String checkLogin() throws Exception {  
  40.   
  41.         System.out.println(" :: checkLogin " + " " + new java.util.Date());  
  42.   
  43.         return "login";  
  44.   
  45.     }  
  46.   
  47. }  

HTML

[html] view plaincopy
 
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  2.   
  3. <html>  
  4.   
  5.   <head>  
  6.   
  7.     <title>index</title>  
  8.   
  9.     <script type="text/javascript">  
  10.   
  11.         function submitForm(){  
  12.   
  13.             var url = "/demo/tokenInterceptor_checkLogin.action";  
  14.   
  15.             var token = "struts.token.name=struts.token";  
  16.   
  17.             var token2 = "struts.token=";  
  18.   
  19.             token2 += document.getElementsByName("struts.token")[0].value;  
  20.   
  21.             url += "?" + token + "&";  
  22.   
  23.             url += token2;  
  24.   
  25.             document.location.href = url;  
  26.   
  27.         }  
  28.   
  29.     </script>  
  30.   
  31.   </head>  
  32.   
  33.   
  34.   
  35.   <body>  
  36.   
  37.     <form action="/demo/tokenInterceptor_checkLogin.action" method="post">  
  38.   
  39.         <s:token id="tokenId" />  
  40.   
  41.         <br>  
  42.   
  43.           
  44.   
  45.         <input type="submit">  
  46.   
  47.         <input type="button" onclick="submitForm()" value="非表单提交">  
  48.   
  49.     </form>  
  50.   
  51.   </body>  
  52.   
  53. </html>  

这是有表单的情况,下面提供一段js是没有表单的情况。正好在我系统里用到了这样的需求,一样粘上来这是我做的一个简单的demo,也是一刚开始学的时候,自己学着写的。在这过程中,我过我常容易出现错误的几个问题,都做了记号

总结

要想让自己的技术不会被淘汰,只有靠自己。我想作为一名IT人员都明白一个道理,没有自学能力的人,是没法成为IT精英的。

分享到:
评论
1 楼 xiaodong* 2014-03-13  
踩踩 学习喽 介绍一不错的博客给亲 http://jinnianshilongnian.iteye.com/

相关推荐

    struts2 拦截器(AOP,面向切面编程)

    **TokenInterceptor**是Struts2的一个特定拦截器,主要用于防止重复提交。在表单提交过程中,如果用户意外刷新页面,可能会导致数据重复录入。TokenInterceptor通过在客户端生成一个令牌(Token),并在服务器端检查...

    Struts2入门教程(全新完整版)

    十二、总结 本教程对struts2的基本知识进行了一些说明,关于struts2的更多详细内容应参看struts2的官方文档及提供的app实例。 下面对struts2的基本执行流程作一简要说明,此流程说明可以结合官方提供的struts2结构图...

    struts2的令牌机制

    &lt;interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/&gt; ``` 然后将拦截器栈应用到特定的Action或者整个应用。 2. **生成令牌**:在Action类中,调用`TokenHelper`的`...

    struts2令牌解决页面重复提交问题

    - 配置Struts2的`TokenInterceptor`,确保它在其他拦截器之前执行。 此外,为了防止跨站请求伪造(CSRF)攻击,Struts2的令牌机制还可以配合`filterDispatcher`配置实现。通过设置`struts.action.excludePattern`,...

    struts2token回退刷新

    Struts2 Token回退刷新是一种防止重复提交的安全机制,尤其在处理并发操作和防止 CSRF(跨站请求伪造)攻击时显得尤为重要。Struts2框架提供了一种令牌验证的方式来确保每个表单提交是唯一的,避免了恶意用户通过...

    jsp-struts2

    在整合JSP和Struts2时,我们通常会创建一个Struts2 Action类,这个类会处理来自JSP页面的请求,并返回相应的视图。Action类需要继承自`org.struts2.StrutsActionSupport`或自定义的Action支持类,并实现相应的方法。...

    struts2中token限制表单多次提交

    &lt;interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/&gt; &lt;!-- Add other interceptors here --&gt; &lt;!-- ... --&gt; ``` 这里定义了一个名为`token`的拦截器,并将其添加到...

    Struts2 表单 重复提交

    &lt;interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/&gt; ... *Action" class="com.yourcompany.YourAction"&gt; &lt;interceptor-ref name="token"&gt; &lt;!-- 或者tokenSession --&gt; ...

    Struts2 防重复提交Demo

    3. **验证令牌**:Struts2拦截器(如TokenInterceptor)会检查这个令牌,如果令牌存在且未被使用过,那么处理表单请求,否则返回错误页面或重定向。 4. **令牌销毁**:处理完请求后,无论成功还是失败,都会从...

    struts2_token控制刷新重复提交

    &lt;interceptor name="token" class="com.opensymphony.xwork2.interceptor.TokenInterceptor"/&gt; &lt;!-- ... --&gt; &lt;!-- ... --&gt; ``` **如何使用Token机制** 1. **创建Token:** 当用户打开一个需要防止重复...

    Struts2防止表单重复提交示例

    &lt;interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/&gt; &lt;!-- 可以设置参数,例如设置失败后跳转的Action --&gt; &lt;param name="includeActionNames"&gt;save* ...

    struts2防止重复提交

    &lt;interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/&gt; &lt;!-- ... --&gt; &lt;!-- ... --&gt; ``` 2. 在Action类中处理令牌:在Action类中,可以通过`TokenAwareActionSupport`类来...

    利用Struts2的令牌机制。

    &lt;interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/&gt; &lt;!-- other interceptors --&gt; &lt;!-- other interceptors --&gt; ``` 然后,你可以在表单页面上使用`s:token`标签...

    struts2_工作流程

    Struts2是一个强大的MVC框架,它简化了Java Web应用的开发。其核心工作流程涉及多个组件协同工作,包括过滤器、ActionMapper、ActionProxy、ActionInvocation、Interceptor以及Dispatcher等。下面将详细解释这些概念...

    struts令牌token实例

    &lt;interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/&gt; &lt;!-- other interceptors --&gt; &lt;!-- other interceptors --&gt; ``` 这样,所有Action都会经过Token拦截器。 2...

    用STRUTS的TOKEN机制解决表单重复提交,转载自:百度文库

    在实际开发中,Struts提供了`org.apache.struts2.interceptor.TokenInterceptor`拦截器来自动化这个过程。只需要在Struts配置文件中启用这个拦截器,并指定对应的错误页面,就可以自动处理重复提交的问题。 例如,...

    用struts使用Token机制来实现防重复提交

    &lt;interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/&gt; &lt;!-- 添加Token拦截器到默认的拦截器栈 --&gt; &lt;!-- 其他拦截器 --&gt; ``` 2. **创建TokenActionSupport类**: ...

    struts拦截器介绍

    Struts2 框架是Java Web开发中广泛使用的MVC框架之一,它极大地简化了企业级应用的开发。在Struts2中,拦截器(Interceptor)是一个至关重要的概念,它扮演着处理请求、增强功能和控制流程的角色。拦截器是在Action...

Global site tag (gtag.js) - Google Analytics