在上一次[https://www.cnblogs.com/webor2006/p/9096412.html]对okhttp的拦截器有了一个初步的认识,接下来则对具体的拦截器一个个进行了解. RetryAndFollowUpInterceptor: 按照添加拦截器的顺序来分析,首当其冲的就是这个重试拦截器啦,如下: 而它是在RealCall构造时所创建的: 从这个类的名字来看应该它就是用来网络异常重连用的,那具体实现细节还得从源码上来进行观察,我们知道对于拦截器中最核心的方法是intercept(…
今天来学习OkHttp的最后一个拦截器,如下: 看一下它的javadoc说明: 其作用有两个:发起网络请求和接收服务器响应,下面具体来看一下它的intercept(): 下面具体来看一下: 接着就是读取响应信息了: 下面来总结一下Okhttp中一次网络请求的大致过程: 1.Call对象对请求的封装. 2.dispatcher对请求的分发. 3.getReponseWithInterceptors()方法. 而此时回顾一下拦截器: RetryAndFollowUpInterceptor:主要是负责…
主流程分析: 继续分析okhttp的拦截器,继上次分析了CacheInterceptor缓存拦截器之后,接下来到连接拦截器啦,如下: 打开看一下它的javadoc: 而整个它的实现不长,如下: 也就是真正发起与服务器的连接就是从这个拦截器开始滴,还是按惯例分析拦截器就得看它的intercept()方法,如下: 其中这个对象的创建是在之前咱们分析的第一个重试拦截器里面,这里再来回顾一下其拦截器的调用顺序: 而StreamAllocation的创建在这: 好,回到咱们主流程继续往下: 面HttpCo…
在上一次[https://www.cnblogs.com/webor2006/p/9150658.html]了解了缓存的存与取的细节之后,接下来就可以分析一下OkHttp的缓存拦截器啦: OkHttp的缓存其实都是由该缓存来完成的,所以来看一下它的intercept()的实现细节: 那进一步来看一下该缓存策略是干嘛的? 跟进去看一下是如何来生成缓存策略的: 此时回到主流程上来: 那它的具体实现呢?其实在该接口的描述中有说明: 所以点击okhttp3.Cache去观注一下: 好,继续回到主流程往下…
OkHttp 拦截器流程源码分析 在这篇博客 OkHttp3 拦截器(Interceptor) ,我们已经介绍了拦截器的作用,拦截器是 OkHttp 提供的对 Http 请求和响应进行统一处理的强大机制,它可以实现网络监听.请求以及响应重写.请求失败充实等功能. 同时也了解了拦截器可以被链接起来使用,我们可以注册自定义的拦截器(应用拦截器和网络拦截器)到拦截器链上,如下图: 实际上除了我们自定义的拦截器外,OkHttp 系统内部还提供了几种其他的拦截器,就是上图中 OkHttp core 的部分…
前言 之前我们结合设计模式简单说了下OkHttp的大体流程,今天就继续说说它的核心部分--拦截器. 因为拦截器组成的链其实是完成了网络通信的整个流程,所以我们今天就从这个角度说说各拦截器的功能. 首先,做一下简单回顾,从getResponseWithInterceptorChain方法开始. 简单回顾(getResponseWithInterceptorChain) internal fun getResponseWithInterceptorChain(): Response { // Bui…
进阶android,OKhttp源码分析——同步请求的源码分析 OKhttp是我们经常用到的框架,作为开发者们,我们不单单要学会灵活使用,还要知道他的源码是如何设计的. 今天我们来分析一下OKhttp 同步请求的执行流程和源码分析 so,老样子,我们先来一张图   从上图可以看出,不管是同步请求还是异步请求,我们都需要创建一个OKhttpClient对象,用到的是build构造者模式,创建Request对象,然后再OKhttpClient的newCall方法和Request来封装我们的call对…
### 前言 回顾: [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析](https://www.jianshu.com/p/bf1d01b79ce7) [Okhttp3源码解析(2)-Request分析](https://www.jianshu.com/p/5a85345c8ea7) [Okhttp3源码解析(3)-Call分析(整体流程)](https://www.jian…
从今天这一节起就要深入到ABP中的每一个重要的知识点来一步步进行分析,在进行介绍ABP中的拦截器之前我们先要有个概念,到底什么是拦截器,在介绍这些之前,我们必须要了解AOP编程思想,这个一般翻译是面向切面编程,这个是和OOP相对的一个概念,在此之前应该先读一读其概念的介绍.这篇文章的重点是介绍ABP框架中的各种拦截器,并介绍其具体在代码中是如何起作用的. 整个ABP框架中的拦截器开始于AbpBootstrapper的构造函数中,在这里我们创建了一个AbpBootstrapperOptions,在…
参考:https://blog.csdn.net/a624806998/article/details/73863606 引言: 写这篇文章,因为在自己编写实现Http日志拦截器的时候,在拦截器中使用 response.body().string() 获取了返回的数据,但是在经过拦截器后,针对输出处理的时候,会再次调用 response.body().string(),这里就会导致流已关闭的异常. 参考上面的链接,修改了在拦截器中的response中的数据获取.保证了下一步的输出流的处理获取操作…
"一般来说,总是把类的属性定义为private,这更符合现实的逻辑. 但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数"__get()"和"__set()"来获取和赋值其属性,以及检查属性的"__isset()"和删除属性的方法"__unset()". 我们为每个属性做了设置和获取的方法,在PHP5中给我们提供了专门为属性设置值和获取值的方法,"__set()"和&qu…
今天学习和认识了一下,过滤器和SpringMVC的拦截器的区别,学到了不少的东西,以前一直以为拦截器就是过滤器实现的,现在想想还真是一种错误啊,而且看的比较粗浅,没有一个全局而又细致的认识,由于已至深夜,时间原因,我就把一些网友的观点重点摘录下来,大家仔细看后也一定会有一个比较新的认识(在此非常感谢那些大牛们的无私奉献,分享他们的经验与心得,才能让像我这样的小白有机会站一下你们这些巨人的肩膀,才能少走些弯路). 过滤器和拦截器的区别: ①拦截器是基于Java的反射机制的,而过滤器是基于函数回调.…
“一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,以及检查属性的“__isset()”和删除属性的方法“__unset()”.我们为每个属性做了设置和获取的方法,在PHP5中给我们提供了专门为属性设置值和获取值的方法,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(__cons…
“一般来说,总是把类的属性定义为private,这更符合现实的逻辑.   但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,以及检查属性的“__isset()”和删除属性的方法“__unset()”.   我们为每个属性做了设置和获取的方法,在PHP5中给我们提供了专门为属性设置值和获取值的方法,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(…
对于OkHttp的缓存策略其实就是在下一次请求的时候能节省更加的时间,从而可以更快的展示出数据,那在Okhttp如何使用缓存呢?其实很简单,如下: 配置一个Cache既可,其中接收两个参数:一个是缓存的文件,一个是缓存文件的最大大小,所以下面分析一下这个Cache类的一些细节: put方法[写入Response到缓存]: 纵观这个put方法,发现有一个非常引人注目的地方,如下: 另外还需要知晓一点,就是OkHttp维护了一个缓存清理的线程池,来对缓存的自动清理与管理,下面具体来分析一下该put方…
一.异常拦截器是什么? 异常拦截器的作用是提供一个机会,可以设置在action执行过程中发生异常的时候映射到一个结果字符串而不是直接中断. 将异常整合到业务逻辑中,比如在分层系统的调用中可以从底层抛出一个异常,高层捕捉到这个异常就知道发生了什么事情啦. 二.如何使用? 1.两种异常映射类型: 1.1.global global的异常映射对整个package下的action都有效: <struts> <package name="default" namespace=&…
一.它能做什么? 借助于这个拦截器我们可以实现文件的上传和下载功能. 理论部分: struts2的文件上传下载功能也要依赖于Apache commons-fileupload和Apache commons-io两个开源项目,要使用上传功能就需要把它们引入到classpath中. 比如考虑上传文件,几个关键点就是可以传什么类型的文件?可以传多大的文件?传过来以后放哪儿?叫什么名字? 当文件上传过来的时候是放在一个临时目录里的,我们在Action中持有一个成员属性File,这个File指向的就是服务…
一.DefaultWorkflowInterceptor是什么 首先说这东西是干嘛来的,在action中可以对传进来的数据进行验证,方法是实现Validateable接口的validate():void方法,如果发现错误可以addFieldError()或者addActionError(),当添加了错误之后struts2就不会再执行原本的映射方法,而是会直接返回一个结果字符串(如果正常的话返回的应该是要执行的映射到方法的返回值),我们这里要探讨的就是struts2是怎么知道我们添加了错误,又是怎…
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------…
前面博客我们介绍了开发struts2应用程序的基本流程(开发一个struts2的实例),通过前面我们知道了struts2实现请求转发和配置文件加载都是拦截器进行的操作,这也就是为什么我们要在web.xml配置struts2的拦截器的原因了.我们知道,在开发struts2应用开发的时候我们要在web.xml进行配置拦截器org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter(在一些老版的一般配置org.apache…
研究了一下HttpURLConnection的源码: 在使用的时候都是通过URL.openConnection()来获取HttpURLConnection对象,然后调用其connect方法进行链接,所以先从URL.penConnection()入手: /** * Returns a new connection to the resource referred to by this URL. * * @throws IOException if an error occurs while ope…
在上面一篇中我们主要是了解了在ABP系统中是如何使用UnitOfWork以及整个ABP系统中如何执行这些过程的,那么这一篇就让我们来看看UnitOfWorkManager中在执行Begin和Complete方法中到底执行了些什么?还是和往常一样来看看UnitOfWorkManager这个类,如果没有读过上面一篇,请点击这里. /// <summary> /// Unit of work manager. /// </summary> internal class UnitOfWor…
ABP中UnitOfWorkRegistrar拦截器是整个ABP中非常关键的一个部分,这个部分在整个业务系统中也是用的最多的一个部分,这篇文章的主要思路并不是写如何使用ABP中的UnitOfWork,重点在于分析整个ABP框架中是如何实现工作单元的,如果想了解如何快速使用ABP中的UnitOfWork,请读下面的文章,这个是ABP的官方文档. 整个过程的分析还是按照之前系列拦截器中的顺序进行说明,首先是从AbpBootstrapper中的构造函数开始说起. /// <summary> ///…
在上面两篇介绍了ABP中的ValidationInterceptor之后,我们今天来看看ABP中定义的另外一种Interceptor即为AuditingInterceptor,顾名思义就是一种审计相关的作用,在了解这篇文章之前,你也可以先看一下ABP官方文档,从而对这个过程有一个更清晰的理解,整个过程也是从AbpBootstrapper中的AddInterceptorRegistrars方法开始的,在这个方法中首先对AuditingInterceptor进行初始化操作,具体的来看看下面的代码.…
今天我们接着之前的系列接着来写另外一种拦截器EntityHistoryInterceptor,这个拦截器到底是做什么的呢?这个从字面上理解是实体历史?这个到底是什么意思?带着这个问题我们来一步步去分析. 整个拦截器的运行过程和前面几篇是一样的,这里就不再赘述,首先也是在AbpBootstrapper的构造函数中完成初始化过程. private void AddInterceptorRegistrars() { ValidationInterceptorRegistrar.Initialize(I…
今天项目中遇到需要将从push接收到的数据按照协议parse成应用层需要的结构化数据类型问题:因为push消息类型繁多,等待解析出的结构化数据类型也多样,有的还需要经过几步的parse过程:而且因为项目历史原因,使用Protocal Buffer(push的数据是字节形式的传递).中间尝试了代理.装饰等模式,都失败了,最终还是使用了原始的继承解决问题:在解决问题个过程中也学习了下OkHttp中的拦截器实现,这里做简单记录: ﷒拦截器的接口定义如下: 可以看到,在拦截器的回调中,我们可以拿到两个重…
最大恢复追逐次数: ; 处理的业务: 实例化StreamAllocation,初始化一个Socket连接对象,获取到输入/输出流()基于Okio 开启循环,执行下一个调用链(拦截器),等待返回结果(Response) 如果发生错误,判断是否继续请求,否:退出 检查响应是否符合要求,是:返回 关闭响应结果 判断是否达到最大限制数,是:退出 检查是否有相同连接,是:释放,重建连接 重复以上流程 源码 @Override public Response intercept(Chain chain) t…
前面一遍,我们对类的加载有了一个整体的认识,而这一节我们细节分析一下类加载器的第一步,即:加载. 一.概念 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构. 加载.class文件的方式: 1.从本地系统中直接加载 2.通过网络下载.class文件 3.从zip,jar等归档文件中加载.class文件 4.从专有数据库中提取.class文件 5.将Java源文件动态…
前言 此篇博客只讲解okhttp的拦截器功能的详细使用,如果你还不太了解okhttp可以参考我另外一篇博客 Android 开发 框架系列 OkHttp使用详解 添加Interceptor的简单例子 在 Android 开发 框架系列 OkHttp使用详解 可以了解到okhttp的基本使用,初始化OkHttpClient的时候我们可以添加拦截器,如下: // 配置一些信息进入OkHttpClient mOkHttpClient = new OkHttpClient().newBuilder()…
今天学习和认识了一下,过滤器和SpringMVC的拦截器的区别,学到了不少的东西,以前一直以为拦截器就是过滤器实现的,现在想想还真是一种错误啊, 而且看的比较粗浅,没有一个全局而又细致的认识,由于已至深夜,时间原因,我就把一些网友的观点重点摘录下来,大家仔细看后也一定会有一个比较新的认识 (在此非常感谢那些大牛们的无私奉献,分享他们的经验与心得,才能让像我这样的小白有机会站一下你们这些巨人的肩膀,才能少走些弯路). 过滤器和拦截器的区别: ①拦截器是基于java的反射机制的,而过滤器是基于函数回…