interceptor

andorid jar/库源码解析之okhttp3

吃可爱长大的小学妹 提交于 2020-04-26 16:01:26
目录: andorid jar/库源码解析 Okhttp3:   作用:      用于网络编程(http,https)的快速开发。   栗子: // okHttpClient定义成全局静态,或者单例,不然重复new可能导致连接数耗尽 OkHttpClient okHttpClient = new OkHttpClient(); String url = "https://www.test.com" ; byte [] data = new byte [] { 1 }; okhttp3.RequestBody body = okhttp3.RequestBody.create(MediaType.parse("application/octet-stream" ), data); // Request Request request = new Request.Builder().addHeader("Authorization", "Bearer XXXXXXXX" ).url(url).post(body).build(); // Response Response response = okHttpClient.newBuilder().build().newCall(request).execute(); // 注意:这里是string不是toString final

源码系列--OkHttp

孤者浪人 提交于 2020-04-26 07:45:38
OkHttp官网地址: https://square.github.io/okhttp/ 用法如下:(get请求) package okhttp3.guide; import java.io.IOException; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class GetExample { OkHttpClient client = new OkHttpClient(); String run(String url) throws IOException { Request request = new Request.Builder() .url(url) .build(); try (Response response = client.newCall(request).execute()) { return response.body().string(); } } public static void main(String[] args) throws IOException { GetExample example = new GetExample(); String response = example.run("https://raw

阿里ARouter使用及源码解析(一)

一世执手 提交于 2020-04-24 16:53:15
在app的开发中,页面之间的相互跳转是最基本常用的功能。在Android中的跳转一般通过显式intent和隐式intent两种方式实现的,而Android的原生跳转方式会存在一些缺点: 显式intent的实现方式,因为会存在直接的类依赖的问题,导致耦合严重; 隐式intent的实现方式,则会出现规则集中式管理,导致协作变得困难; 可配置性较差,一般而言配置规则都是在Manifest中的,这就导致了扩展性较差; 跳转过程无法控制,一旦使用了StartActivity()就无法插手其中任何环节了,只能交给系统管理; 当多组件化开发,使用原生的路由方式很难实现完全解耦; 而阿里的 ARouter 路由框架具有解耦、简单易用、支持多模块项目、定制性较强、支持拦截逻辑等诸多优点,很好的解决了上述的问题。关于ARouter具体实现功能,典型应用以及相应技术方案实现的介绍不在这详细介绍,具体可参见 开源最佳实践:Android平台页面路由框架ARouter 。 阿里ARouter的分析计划 阿里ARouter使用及源码解析(一) 阿里ARouter拦截器使用及源码解析(二) 阿里ARouter参数自动装载使用及源码解析(三) 基本功能使用 1.添加依赖和配置 android { defaultConfig { ... javaCompileOptions {

Mybatis源码详解系列(三)--从Mapper接口开始看Mybatis的执行逻辑

£可爱£侵袭症+ 提交于 2020-04-24 12:53:17
Mybatis源码详解系列(三)--从Mapper接口开始看Mybatis的执行逻辑 简介 Mybatis 是一个持久层框架,它对 JDBC 进行了高级封装,使我们的代码中不会出现任何的 JDBC 代码,另外,它还通过 xml 或注解的方式将 sql 从 DAO/Repository 层中解耦出来,除了这些基本功能外,它还提供了动态 sql、延迟加载、缓存等功能。 相比 Hibernate,Mybatis 更面向数据库,可以灵活地对 sql 语句进行优化。 本文继续分析 Mybatis 的源码,第1点内容上一篇博客已经讲过,本文将针对 2 和 3 点继续分析: 加载配置、初始化SqlSessionFactory; 获取SqlSession和Mapper; 执行Mapper方法。 除了源码分析,本系列还包含 Mybatis 的详细使用方法、高级特性、生成器等,相关内容可以我的专栏 Mybatis。 注意,考虑可读性,文中部分源码经过删减。 隐藏在Mapper背后的东西 从使用者的角度来看,项目中使用 Mybatis 时,我们只需要定义Mapper接口和编写 xml,除此之外,不需要去使用 Mybatis 的其他东西。当我们调用了 Mapper 接口的方法,Mybatis 悄无声息地为我们完成参数设置、语句执行、结果映射等等工作,这真的是相当优秀的设计。 既然是分析源码

代理模式是什么?如何在 C# 中实现代理模式

你离开我真会死。 提交于 2020-04-23 22:30:46
代理模式 并不是日常开发工作中常常用到的一种设计模式,也是一种不易被理解的一种设计模式。但是它会广泛的应用在系统框架、业务框架中。 定义 它的 定义 就如其它同大部分 设计模式 的定义类似,即不通俗也不易懂,而且随便百度一下就能找到 : 为其他对象提供一种代理,以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用。 每个字都认识,连在一起就看不懂了 by. 某个攻城狮 我们一个词一个词看就明白了。 其他对象 所谓的 其它 ,其实就是你系统中 任意 一个类型,可以是 UserService 、 OrderRepository 、 DataDeletedEventListener 、等等。 控制对这个对象的访问 访问 其实就是调用这个对象上的方法、访问它的属性、设置它的属性等等,比如 User user = UserService.GetUserById(1); // 访问了 GetUserById 方法 int id = user.Id; // 访问了 Id 属性 Order order = OrderRepository.SelectByUserId(id); // 访问了 SelectByUserId 方法 控制访问 , 控制 的本质是包装,外部不再直接使用 其他对象 ,而是使用 代理 ,再由代理来访问 其它对象 。我们可以使用一个已有的 List<T> 实现一个

springboot+redis+Interceptor+自定义annotation实现接口自动幂等

♀尐吖头ヾ 提交于 2020-04-23 10:45:29
前言: 在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,我们来解释一下幂等的概念: 任意多次执行所产生的影响均与一次执行的影响相同 。按照这个含义,最终的含义就是 对数据库的影响只能是一次性的,不能重复处理。如何保证其幂等性,通常有以下手段: 1:数据库建立唯一性索引,可以保证最终插入数据库的只有一条数据 2:token机制,每次接口请求前先获取一个token,然后再下次请求的时候在请求的header体中加上这个token,后台进行验证,如果验证通过删除token,下次请求再次判断token 3:悲观锁或者乐观锁,悲观锁可以保证每次for update的时候其他sql无法update数据(在数据库引擎是innodb的时候,select的条件必须是唯一索引,防止锁全表) 4:先查询后判断,首先通过查询数据库是否存在数据,如果存在证明已经请求过了,直接拒绝该请求,如果没有存在,就证明是第一次进来,直接放行。 redis实现自动幂等的原理图: 目录 一:搭建redis的服务Api 1:首先是搭建redis服务器,这个之前搭过了,就不赘述了。详情可参考: https://www.cnblogs.com/wyq178/p/10340234.html 2:引入springboot中到的redis的stater,或者Spring封装的jedis也可以

pringboot 2.x 如何解决重复提交 (本地锁的实践)

心不动则不痛 提交于 2020-04-22 16:18:24
有没有遇到过这种情况:网页响应很慢,提交一次表单后发现没反应,然后你就疯狂点击提交按钮(12306就经常被这样怒怼),如果做过防重复提交还好,否则那是什么级别的灾难就不好说了。。。 本文主要是应用 自定义注解、 spring AOP、· Guava Cache 生成一种本地锁,来达到的防重复提交效果,由于是基于内存的缓存, 所以这种实现方式并不适用于分布式服务 Guava是什么? guava包是google嫌弃JAVA自带的类库不好用,自行研发的一套工具包,对JDK工具做了很好的拓展。例如:并发[Concurrency]、缓存[Caches]、 函数式风格[Functional idioms]、 字符串处理[Strings]等等。 一、引入Guava包依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>21.0</version> </dependency> 二、自定义LocalLock注解 自定义一个LocalLock注解用于需要防止重复提交的方法上 /** * 锁的注解 * */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented

互联网轻量级框架SSM-查缺补漏第八天(MyBatis插件plugin使用及原理)

微笑、不失礼 提交于 2020-04-18 03:59:02
  简言:今天进行第八天的记录(只是写了八天)。有的时候看的多,有的时候看的少,看的少的时候就攒几天一起写了。而今天这个插件我昨天写了一下午,下班没写完就回去了,今天把尾收了,再加上一个过程图方便下面原理的理解。我这个特别不爱看书的人都看半个多月了,希望我一个月真能养成个戒不掉的习惯~ 第八章 插件   在前一篇介绍了四个对象,是SqlSession执行过程中通过他们来完成数据库操作和结果返回的。( Executor 、 StatementHandler 、 ParameterHandler 、 ResultSetHandler )。我昨天的查缺补漏有记载,要是想深入了解就可以去查资料了,或者看我这本书的第七章(书名《JavaEE 互联网轻量级框架整合开发》)    插件的原理 就是 在四大对象调度时插入我们的代码去执行一些特殊的要求以满足特殊的场景需求 。   斜体字是部分 原理 。我先在这插入一张流程图,如果有疑问可以看到最后再返回来琢磨一下这个图。    使用方法 :(举例:要想在预编译之前在控制台上打印一些东西,就需要拦截执行SQL的StatementHandler对象的预编译方法,也就是prepare方法)   在MyBatis中使用插件,就必须实现 interceptor 接口,实现它的三个方法(代码中有注释,应该能知道啥意思): package com.ssm

RestTemplate设置通用header

心不动则不痛 提交于 2020-04-17 21:27:22
增加interceptor public static class UserAgentInterceptor implements ClientHttpRequestInterceptor { @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { HttpHeaders headers = request.getHeaders(); headers.add(HttpHeaders.USER_AGENT, "your agent"); return execution.execute(request, body); } } 设置interceptor @Bean public RestTemplate restTemplate() { HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory(); httpRequestFactory.setConnectionRequestTimeout(CONN_TIMEOUT

NestJS Interceptors: Unable to set HTTP Headers on outgoing requests

会有一股神秘感。 提交于 2020-04-16 03:05:33
问题 I am writing APIs in NestJS which have a set of common headers. I decided to use interceptors in order to append headers to outgoing requests. The headers do not get appended to the request and hence the request keep on failing. Interceptor import * as utils from '../utils/utils'; import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common'; import { HEADERS } from '../middlewares/headers.constant'; import { Observable } from 'rxjs'; import { Request } from