struts2拦截器详解

废话没有多少说了,直接给大家贴代码了,具体代码如下所述;

在事先的小说中,大家早就提到到了拦截器(Interceptor)的定义。 

在前头的篇章中,大家早就提到到了拦截器(Interceptor)的概念。 

<!DOCTYPE html>
<html ng-app="nickApp">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
  <title>interceptors</title>
  <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
  <script>
    /*
     $http service在Angular中用于简化与后台的交互过程,其本质上使用XMLHttpRequest或JSONP进行与后台的数据交互。
     在与后台的交互过程中,可能会对每条请求发送到Server之前进行预处理(如加入token),或者是在Server返回数据到达客户端还未被处理之前进行预处理(如将非JSON格式数据进行转换);
     当然还有可能对在请求和响应过程过发生的问题进行捕获处理。所以Angular为我们提供了$http拦截器,用来实现上述需求。*/
    /*
     $httpProvider中有一个 interceptors 数组,而所谓拦截器只是一个简单的注册到该数组中的常规服务工厂。
     1 首先 创建一个拦截器服务工厂
     */
    angular.module('nickApp', [])
        .factory('NickInterceptor', ['$q', function ($q) {
          return {
            // 可选,拦截成功的请求
            /*
             该方法会在$http发送请求到后台之前执行,因此你可以修改配置或做其他的操作。
             该方法接收请求配置对象(request configuration object)作为参数,然后必须返回配置对象或者promise 。
             如果返回无效的配置对象或者 promise 则会被拒绝,导致$http 调用失败
             */
            request: function (config) {
              // 进行预处理
              // 例如加令牌
              config.headers['Authorization'] = 'token666';
              /*
               Request Headers
               token:token666 //加的令牌
               */
              return config || $q.when(config);
            },
            // 可选,拦截成功的响应
            /*
             该方法会在$http接收到从后台过来的响应之后执行,因此你可以修改响应或做其他操作。
             该方法接收响应对象(response object)作为参数,
             然后必须返回响应对象或者promise。响应对象包括了请求配置(request configuration),头(headers),状态(status)和从后台过来的数据(data)。
             如果返回无效的响应对象或者 promise 会被拒绝,导致$http调用失败。
             */
            response: function (response) {
              // 进行预处理
              // 例如 JSON.parse(response)等
              return response || $q.when(reponse);
            },
            // 可选,拦截失败的请求
            /*
             有时一个请求发送失败或者被拦截器拒绝了。requestError拦截器会捕获那些被上一个请求拦截器中断的请求。
             它可以用来恢复请求或者有时可以用来撤销请求之前所做的配置,比如关闭遮罩层,显示进度条,激活按钮和输入框之类的。
             */
            requestError: function (rejection) {
              // 对失败的请求进行处理
              // 例如 统一的弹窗提示
              return $q.reject(rejection);
            },
            // 可选,拦截失败的响应
            /*
             有时候我们后台调用失败了。也有可能它被一个请求拦截器拒绝了,或者被上一个响应拦截器中断了。
             在这种情况下,响应异常拦截器可以帮助我们恢复后台调用。
             */
            responseError: function (rejection) {
              // 对失败的响应进行处理
              // 例如 统一的弹窗提示
              return $q.reject(rejection);
            }
          };
        }])
        /*
         $httpProvider中有一个 interceptors 数组,而所谓拦截器只是一个简单的注册到该数组中的常规服务工厂。
         2 在config方法中,将拦截器加入到$httpProvider.interceptors数组中
         */
        .config(['$httpProvider', function ($httpProvider) {
          $httpProvider.interceptors.push('NickInterceptor');
        }])
        .controller('bodyCtl', ['$scope', '$http', function ($scope, $http) {
          $scope.test1 = function () {
            console.log(11);
            $http.get('interceptors.html');
          };
        }])
  </script>
</head>
<body ng-controller="bodyCtl">
<button class="btn" ng-click="test1()">click me</button>
<div ng-view></div>
</body>
</html>

downpour 写道

downpour 写道

以上所述是作者给我们介绍的Angular中的interceptors拦截器,希望对大家有所扶助,假使我们有其余疑窦迎接给我留言,小编会及时回复大家的!

拦截器是AOP中的概念,它自个儿是一段代码,能够经过定义“织入点”,来钦命拦截器的代码在“织入点”的左右推行,从而起到拦截的机能。正如上边Struts2的Reference中讲述的,Struts2的Interceptor,其阻碍的指标是Action代码,能够定义在Action代码在此以前依旧现在实行拦截器的代码。

拦截器是AOP中的概念,它自身是一段代码,可以经过定义“织入点”,来内定拦截器的代码在“织入点”的前后实行,从而起到拦截的效应。正如上边Struts2的Reference中讲述的,Struts2的Interceptor,其阻碍的靶子是Action代码,能够定义在Action代码从前还是现在试行拦截器的代码。

您大概感兴趣的篇章:

  • angular中的http拦截器Interceptors的实现
  • 详解AngularJS用Interceptors来归并管理HTTP请求和响应

接下去,大家将重大钻探一下Struts第22中学的拦截器的内部结议和实行顺序,并组王永珀码进行辨析。 

接下去,我们将主要钻探一下Struts第22中学的拦截器的内部结交涉实践各样,并组王大雷码举行辨析。 

Interceptor结构 
我们得以窥见,Struts2的Interceptor一层一层,把Action包裹在最中间。那样的布局,大概有以下一些风味: 
1.
全勤结构就不啻一个储藏室,除了Action以外,货仓中的其余因素是Interceptor 
2.
Action位居货仓的尾巴部分。由于旅舍”先进后出”的风味,要是大家计算把Action拿出去实践,大家不能够不首先把位于Action上端的Interceptor拿出去试行。那样,整个实行就形成了一个递归调用 
3.
各类位于旅舍中的Interceptor,除了须求完结它本人的逻辑,还索要形成贰个特殊的实行职务。那些试行职分有3种采取: 

Interceptor结构 
咱俩得以窥见,Struts2的Interceptor一层一层,把Action包裹在最中间。这样的构造,大约有以下一些表征: 
1.
全勤结构就犹如一个仓房,除了Action以外,饭店中的其他因素是Interceptor 
2.
Action位居旅馆的最底层。由于货仓”先进后出”的特点,如果大家试图把Action拿出去实行,大家必须首先把位于Action上端的Interceptor拿出去施行。那样,整个施行就形成了四个递归调用 
3.
各个位于旅社中的Interceptor,除了要求变成它本人的逻辑,还亟需做到八个标新立异的实行义务。这几个实施职务有3种接纳: 

1) 中止整个试行,直接回到一个字符串作为resultCode 

1) 中止整个施行,间接重返三个字符串作为resultCode 

2) 通过递归调用担当调用仓库中下多少个Interceptor的试行 

2) 通过递归调用肩负调用仓库中下二个Interceptor的执行 

3) 假设在货仓内已经不存在别的的Interceptor,调用Action 

3) 假使在仓库内已经不存在别的的Interceptor,调用Action 

Struts2的拦截器结构的规划,实际上是一个优异的义务链情势的采用。首先将全数实践划分成多少一样类别的要素,每一个成分具有分裂的逻辑权利,并将他们纳入到三个链式的数据结构中(大家得以把库房结构也视作是三个递归的链式结构),而种种成分又有职责承担链式结构中下四个要素的施行调用。 

Struts2的拦截器结构的安顿性,实际上是四个标准的义务链格局的行使。首先将全部实施划分成多少同等档案的次序的元素,每一个成分具备差别的逻辑权利,并将他们纳入到多少个链式的数据结构中(大家可以把饭店结构也当作是贰个递归的链式结构),而种种成分又有职务负责链式结构中下二个成分的试行调用。 

这么的规划,从代码重构的角度来看,实际上是将贰个繁杂的种类,分而治之,从而使得种种部分的逻辑能够中度重用并兼有中度可扩张性。所以,Interceptor结构其实是Struts2/Xwork企划中的优秀之笔。 

那样的安顿,从代码重构的角度来看,实际上是将三个叶影参差的系统,分而治之,从而使得各种部分的逻辑能够高度重用并具有高度可增添性。所以,Interceptor结构其实是Struts2/Xwork规划中的精湛之笔。 

Interceptor实行分析 

Interceptor试行深入分析 

Interceptor的定义 

Interceptor的定义 

大家来看一下Interceptor的接口的概念: 

咱俩来看一下Interceptor的接口的概念: 

Java代码  图片 1

Java代码  图片 2

  1. public interface Interceptor extends Serializable {  
  2.   
  3.     /** 
  4.      * Called to let an interceptor clean up any resources it has allocated. 
  5.      */  
  6.     void destroy();  
  7.   
  8.     /** 
  9.      * Called after an interceptor is created, but before any requests are processed using 
  10.      * {@link #intercept(com.opensymphony.xwork2.ActionInvocation) intercept} , giving 
  11.      * the Interceptor a chance to initialize any needed resources. 
  12.      */  
  13.     void init();  
  14.   
  15.     /** 
  16.      * Allows the Interceptor to do some processing on the request before and/or after the rest of the processing of the 
  17.      * request by the {@link ActionInvocation} or to short-circuit the processing and just return a String return code. 
  18.      * 
  19.      * @return the return code, either returned from {@link ActionInvocation#invoke()}, or from the interceptor itself. 
  20.      * @throws Exception any system-level error, as defined in {@link com.opensymphony.xwork2.Action#execute()}. 
  21.      */  
  22.     String intercept(ActionInvocation invocation) throws Exception;  
  23. }  
  1. public interface Interceptor extends Serializable {  
  2.   
  3.     /** 
  4.      * Called to let an interceptor clean up any resources it has allocated. 
  5.      */  
  6.     void destroy();  
  7.   
  8.     /** 
  9.      * Called after an interceptor is created, but before any requests are processed using 
  10.      * {@link #intercept(com.opensymphony.xwork2.ActionInvocation) intercept} , giving 
  11.      * the Interceptor a chance to initialize any needed resources. 
  12.      */  
  13.     void init();  
  14.   
  15.     /** 
  16.      * Allows the Interceptor to do some processing on the request before and/or after the rest of the processing of the 
  17.      * request by the {@link ActionInvocation} or to short-circuit the processing and just return a String return code. 
  18.      * 
  19.      * @return the return code, either returned from {@link ActionInvocation#invoke()}, or from the interceptor itself. 
  20.      * @throws Exception any system-level error, as defined in {@link com.opensymphony.xwork2.Action#execute()}. 
  21.      */  
  22.     String intercept(ActionInvocation invocation) throws Exception;  
  23. }  

Interceptor的接口定义未有啥特别的地点,除了init和destory方法以外,intercept方法是贯彻全方位拦截器机制的基本措施。而它所依据的参数ActionInvocation则是大家后面章节中一度提到过的盛名的Action调治者。 

Interceptor的接口定义未有啥样特别的地点,除了init和destory方法以外,intercept方法是兑现全体拦截器机制的着力措施。而它所依附的参数ActionInvocation则是大家事先章节中一度提到过的显赫的Action调治者。 

大家再来看看二个超人的Interceptor的悬空实现类: 

大家再来看看贰个第一名的Interceptor的虚幻完成类: 

Java代码  图片 3

Java代码  图片 4

  1. public abstract class AroundInterceptor extends AbstractInterceptor {  
  2.       
  3.     /* (non-Javadoc) 
  4.      * @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation) 
  5.      */  
  6.     @Override  
  7.     public String intercept(ActionInvocation invocation) throws Exception {  
  8.         String result = null;  
  9.   
  10.         before(invocation);  
  11.         // 调用下叁个拦截器,假若拦截器不存在,则实践Action  
  12.         result = invocation.invoke();  
  13.         after(invocation, result);  
  14.   
  15.         return result;  
  16.     }  
  17.       
  18.     public abstract void before(ActionInvocation invocation) throws Exception;  
  19.   
  20.     public abstract void after(ActionInvocation invocation, String resultCode) throws Exception;  
  21.   
  22. }  
  1. public abstract class AroundInterceptor extends AbstractInterceptor {  
  2.       
  3.     /* (non-Javadoc) 
  4.      * @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation) 
  5.      */  
  6.     @Override  
  7.     public String intercept(ActionInvocation invocation) throws Exception {  
  8.         String result = null;  
  9.   
  10.         before(invocation);  
  11.         // 调用下贰个拦截器,借使拦截器不设有,则实行Action  
  12.         result = invocation.invoke();  
  13.         after(invocation, result);  
  14.   
  15.         return result;  
  16.     }  
  17.       
  18.     public abstract void before(ActionInvocation invocation) throws Exception;  
  19.   
  20.     public abstract void after(ActionInvocation invocation, String resultCode) throws Exception;  
  21.   
  22. }  

在那一个达成类中,实际寒温病条辨落到实处了最简便的拦截器的雏形。可能我们对这样的代码还相比较素不相识,那未尝关联。笔者在此地必要建议的是二个很珍爱的情势invocation.invoke()。这是ActionInvocation中的方法,而ActionInvocation是Action调节者,所以这一个措施具有以下2层意思: 

在那一个实现类中,实际寒本草从新达成了最简单易行的拦截器的雏形。或者我们对如此的代码还相比较目生,那从没涉嫌。小编在此处须求提出的是贰个很重要的主意invocation.invoke()。那是ActionInvocation中的方法,而ActionInvocation是Action调解者,所以那么些主意具备以下2层意思: 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图