- 博客(46)
- 收藏
- 关注
原创 锁的升级过程——偏向锁、轻量级锁、重量级锁
对象的内存布局对象头(Header)实例数据(Instance Data)对其填充(Padding)对象头Mark Word:存储对象的hashcode、分代年龄、锁信息等Class Metadata Address(类型指针):存储到对象类型数据的指针Array length:数组长度(数组特有)实例数据对象真正存储的有效信息,继承自父类及子类所定义的所定义的各种类型的字段内容。对齐填充起占位符的作用,对象的大小必须为8字节的整倍数,对象头部分正好为8字节的倍数(1倍或2倍)
2020-08-10 19:50:34
754
原创 session、token、jwt区别分析
1.sessionsession不是在浏览器第一次请求时创建,而是在第一次使用时创建(request.getSession())。最终创建逻辑在org.apache.catalina.connector.Request的doGetSession()方法中,如下代码可以看到,这里会让请求方设置一个cookie:JSESSIONID/* org.apache.catalina.connector.Request doGetSession() 部分代码 */Cookie cookie = Ap
2020-07-08 15:59:17
1553
原创 跨域及跨域请求伪造详解
什么是跨域?简单来说,就是我在一个站点向另一个站点发送了请求(ajax或者链接),只要这两个站点HTTP协议、域名或是端口中有一个不一样,说明发送了跨域。由于浏览器的同域安全策略(the same-origin security policy),这种跨域请求会被禁止。eg.如下为在一个站点向另一个站点发送请求。跨域问题解决(1)@CrossOrigin:该注解有一个origins参数,可配置允许进行跨域的站点。@CrossOrigin(origins = {"http://b.com:8080
2020-07-08 15:26:38
3368
原创 CAP理论的理解
CAP定理的由来CAP定理是加州伯克利分校计算机科学家埃里·布鲁尔(Eric Brewer)于1998年提出的一个假说,并在2000年的分布式计算原则研讨会上发表。在2002年,麻省理工学院的赛斯·吉尔伯特(Seth Gilbert)和南希·林奇(Nancy Lynch)又完成了布鲁尔假说的证明,使之成为一个定理,但吉尔伯特和林奇证明的布鲁尔定理比布鲁尔假说狭义。CAP定理的含义一个分布式系...
2020-04-16 14:36:34
669
原创 Java限流代码实现
常见的限流算法大致有三种:令牌桶算法漏桶算法计数器算法网上对令牌桶又细分为固定窗口计数器限流和滑动窗口计数器限流,下面将对这几种限流方式进行简单的介绍及代码实现。固定窗口计数器限流固定窗口计数器限流就是在固定时间内(如10s),只允许固定的请求数访问(如10个),超过的请求将受到限制。实现逻辑图实现代码package com.dfy.ratelimiter.core;i...
2020-04-13 16:38:23
887
原创 Spring Boot请求拦截及请求参数加解密
代码已上传至github,如遇到问题,可参照代码https://github.com/dfyang55/auth1)加密实现后台代码实现:CodecUtil这里我生成两个AES的私钥,一个只是提高SHA1加密的复杂度,另一个才是用于AES的加解密/** AES密钥长度,支持128、192、256 */private static final int AES_SECRET_KEY_LE...
2020-04-01 09:24:08
12313
3
原创 Java Jsoup使用详解
1.Jsoup介绍jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。——引自百度百科对Jsoup的介绍前置引入Jsoup依赖<dependency> <groupId>org.jsoup</groupId&g...
2020-03-20 14:21:43
6503
原创 Java随机数Random解析
首先介绍一下随机数生成的概念Java随机数的核心就是种子,在Random中其实就是一个AtomicLong类型的变量。private final AtomicLong seed;随机数的生成依赖于种子,当我们通过new Random()创建一个随机数生成器,会通过计算为我们默认生成一个种子的计算值,再通过这个种子的计算值运算得出最终的种子。下面这段代码是Random默认生成种子计算值的逻辑...
2020-01-23 09:56:34
788
原创 Java Nio之Selector源码分析
Pipe——单向管道Pipe使用两组Channel,SinkChannel用于发送数据,SourceChannel用于接收数据。public class PipeDemo { public static void main(String[] args) throws Exception { String msg = "Hello world!"; Pip...
2019-11-03 18:32:05
360
原创 JDK、Guava异步回调使用及源码分析
使用JDK的FutureTask实现的异步调用lCallable有返回值,和Runnable没有关系public interface Callable<V> { V call() throws Exception;}public interface Runnable { public abstract void run();}FutureTask可以认为...
2019-10-20 20:27:19
334
原创 Linux安装Elasticsearch及head插件
提示:本人使用的系统:Centos7。在此之前,请确保安装了JDK,由于安装过于简单,这里不介绍了。下载Elasticsearch【Elasticsearch7.2百度云,本人使用的版本】【官网下载】1.解压tar -zxvf /usr/local/elasticsearch.tar.gz2.修改limits.confvi /etc/security/limits.conf追加如下...
2019-10-12 09:59:10
1219
原创 Java并发编程有序性详解
提示:以下内容是对《Java多线程编程实战指南》的分析与总结,有截选《实战Java高并发程序设计》。一.有序性问题程序在执行过程中,可能会进行指令重排序,重排序后的指令与原指令的顺序未必一致。二.什么是重排序?重排序是对内存访问有关操作所做的一种优化,可以在不影响单线程程序正确性的情况下提升程序性能。这里我们知道,重排序是为了优化程序的执行效率,并且在单线程下能够保证程序的正确执行。...
2019-09-28 20:38:28
663
原创 使用Keytool、OpenSSL构建HTTPS单双向认证
首先介绍下操作过程中会遇到的几种文件格式cer:是数字证书的一种编码格式。pem:OpenSSL最为常见的密钥库文件。csr:证书签发申请。p12:属于PKCS#12标准,可作为Java中的密钥库或信任库直接使用。jks:Java原生的密钥库/信任库文件提示:单向和双向认证都是经过测试的,特别是双向认证测试过很多次。如果按步骤来的话应该是没有什么问题的。使用KeyTool搭建HT...
2019-09-24 16:27:26
919
原创 彻底弄懂快速排序
首先,用一句话介绍快速排序——选出一个基准值,用基准值将数组分为两边,左边小于基准值,右边大于基准值,然后又将左边和右边进行同样的操作,直到整个数组有序。下面用易于理解的方式阐释一下快速排序的大致步骤:这里将小的这边称为(左派),大的这边称为(右派)选择一个基准值(一般是第一个元素) (左派的担保)右派自右向左找一个数小于基准数,然后交给左派 (借给左派)左派自左向右找一个数,交给右...
2019-09-14 13:44:39
565
原创 Spring Data Jpa入门详解
首先创建user表CREATE TABLE `user` (`id` int(11) NOT NULL ,`username` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,`nickname` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_c...
2019-09-06 22:28:33
768
原创 HttpClient+定时实现页面静态化
页面静态化,就是将原本用户访问的url后的最终结果转换为静态页面 (可以是html) ,那么用户在以后的访问直接访问静态页面即可,这样就可以避免中间访问网络或是数据库的过程,从而降低了服务器压力。引入依赖 <dependencies> <dependency> <groupId>org.springframew...
2019-09-02 08:43:38
378
原创 Redis持久化详解
Redis支持的持久化方式在Redis4.0版本之前,Redis支持两种持久化方式,RDB以及AOF,RDB是通过快照也就是记录所有数据的方式,后者是通过记录redis执行的修改命令的方式。从Redis4.0版本支持RDB以及AOF混合的方式,目的就是为了结合两者优点。所以下面从RDB以及AOF开始介绍。(一)RBD持久化方式该方式将内存中的所有数据生成一份副本并存储在硬盘上,这个过程即为 ...
2019-08-17 10:08:05
204
原创 浅谈虚拟机类加载过程
类的加载过程类的加载过程,主要有以下三步加载:通过ClassLoader加载class文件,生成Class对象连接:该过程分为三步,验证、准备、解析验证:主要是验证class文件的正确性与安全性准备:为类变量分配内存并设置类变量初始值解析:将常量池内的符号引用替换为直接引用初始化:执行类变量的赋值和静态初始化这里将着重介绍类的加载、以及初始化过程,而不会对连接部分做阐释。...
2019-08-14 23:49:07
408
原创 使用RateLimiter限流(AOP + 注解实现)
注意:这里不会对RateLimiter做介绍引入依赖 <!-- guava --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> ...
2019-06-25 19:03:54
2491
1
原创 Java防XSS攻击实现(AOP+注解+反射)
本文使用JSP验证效果引人依赖 <!-- springboot-aop --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-...
2019-06-21 18:46:20
2849
2
原创 Shiro认证流程详解(源码分析)
Shiro认证流程详解首先,我们调用subject.login(token);我们将进入到Subject实现类DelegatingSubject的login方法可以看到,又继续调用与Subject绑定的SecurityManager的login方法,因为它是Shiro的管家,所以请求会到它这里程序继续来到SecurityManager的实现类DefaultSecurityManager的...
2019-06-03 21:21:36
440
原创 RabbitMQ生产者事务与Confirm机制
当生产者发送消息后,如何确定消息有没有正确到底RabbitMQ服务器?RabbitMQ提供了两种解决方式:事务机制发送方确认机制首先创建用于获取Connection对象package com.dfyang.rabbitmq;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFac...
2019-06-02 09:43:57
851
原创 Spring Boot整合Quartz持久化到数据库
获取Sql文件http://www.quartz-scheduler.org/downloads/解压获取的sql文件,并在数据库中执行代码编写引入依赖<dependencies> <dependency> <groupId>org.springframework.boot</groupId> &...
2019-06-01 11:20:34
6012
19
原创 Hibernate validator使用以及自定义校验器注解
Hibernate Validator常用注解1.创建自定义校验器import javax.validation.Constraint;import javax.validation.Payload;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import jav...
2019-05-31 17:27:02
27488
2
原创 线程上下文切换详解
什么是上下文切换?CPU通过分配时间片来执行任务,当一个任务的时间片用完,就会切换到另一个任务。在切换之前会保存上一个任务的状态,当下次再切换到该任务,就会加载这个状态。——任务从保存到再加载的过程就是一次上下文切换。切出: 一个线程被剥夺处理器的使用权而被暂停运行切入: 一个线程被系统选中占用处理器开始或继续运行——上图的进度信息就是上下文,一般包括通用寄存器和程序计数器。在切出时,...
2019-05-30 14:35:17
22649
5
原创 Spring Boot创建定时任务
在启动类加上@EnableScheduling注解package com.dfyang;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.schedu...
2019-05-28 14:32:26
254
原创 RabbitMQ实现延迟队列的两种方式
使用RabbitMQ实现延迟队列的两种方式TTL + DLX使用延迟插件Linux安装RabbitMQ首先创建用于连接RabbitMQ的Connectionpackage com.dfyang.rabbitmq;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;...
2019-05-27 09:24:13
16986
4
原创 RabbitMQ死信队列
拒绝消息用于获取Connection对象package com.dfyang.rabbitmq;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;public class RabbitConnectionFact...
2019-05-26 21:24:33
732
原创 使用Spring Cloud Config搭建配置中心(实现自动刷新)
在实际开发中,一般分为四个环境pro环境:生产环境。pre环境:灰度环境。test环境:测试环境。dev环境:开发环境。登录github,分别创建config-pro.properties、config-test.properties、config-dev.properties、config-second-test.properties内容分别为username=propa...
2019-05-26 16:27:39
744
原创 Spring Cloud使用Zuul构建网关
不使用网关会存在的问题?客户端多次请求不同的微服务,增加了客户端的复杂性。存在跨域问题。认证复杂,每个服务都需要独立认证。难以重构,随着项目的迭代,可能需要重写划分微服务。某些微服务可能使用了防火墙/浏览器不友好的协议,直接访问有一定困难。什么是微服务网关?微服务网关介于客户端与服务器端之间,所有的外部请求都会讲过微服务网关。使用微服务网关的优点:客户端只需和网关交互,...
2019-05-26 10:28:30
146
原创 为Eureka Server添加Spring Security认证
使用版本 :Spring Boot:2.1.5 Spring Cloud:Greenwich需要注意的两个地方!Spring Cloud与Spring Boot版本号一致问题Spring Security在高版本默认开启了csrf跨域请求伪造,后面我们会解决这个问题[Spring Boot与Spring Cloud版本对应]https://spring.io/projects/spri...
2019-05-25 19:46:52
1489
原创 Spring Cloud使用ribbon实现负载均衡
Ribbon是什么?Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。也可以使用Ribbon实现自定义的负载均衡算法。Spring Cloud使用Ribbon实现负载均衡Ribbon默认使用轮询来实现负载均衡,也就是如果我们将同一个服务部署在A和B机器...
2019-05-24 15:39:00
151
原创 Spring Cloud入门(注册与发现)
什么是微服务?微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制。微服务架构的特征:一个系统由多个微服务搭建。每个微服务可独立运行在自己的进程里。一个微服务关注特定的功能。微服务之间通过轻量级的通信机制进行通信。微服务之间可使用不同的语言与数据库存储技术。全自动的部署机制。优点:易于开发和维护:一个微服...
2019-05-24 14:37:29
157
1
原创 RateLimiter限流及源码分析
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。 所有这些工具每...
2019-05-21 19:02:51
588
1
原创 RabbitMQ之Exchange、Queue参数详解
1.先来介绍RabbitMQ中的成员Producer(生产者): 将消息发送到ExchangeExchange(交换器):将从生产者接收到的消息路由到QueueQueue(队列):存放供消费者消费的消息BindingKey(绑定键):建立Exchange与Queue之间的关系(个人看作是一种规则,也就是Exchange将什么样的消息路由到Queue)RoutingKey(路由键):Pr...
2019-05-13 22:26:19
17064
3
原创 RabbitMQ之Exchange类型详解
1.先来介绍RabbitMQ中的成员Producer(生产者): 将消息发送到ExchangeExchange(交换器):将从生产者接收到的消息路由到QueueQueue(队列):存放供消费者消费的消息BindingKey(绑定键):建立Exchange与Queue之间的关系(个人看作是一种规则,也就是Exchange将什么样的消息路由到Queue)RoutingKey(路由键):Pr...
2019-05-13 22:24:24
1607
原创 clean channel shutdown(消息发送成功,ConfirmCallback ack返回为false)
clean channel shutdown; protocol method: #method<channel.close>(reply-code=200, reply-text=OK, class-id=0, method-id=0)视频出现的问题@Componentpublic class RabbitSender { @Autowired private ...
2019-05-12 10:41:15
7116
17
原创 一篇文章弄懂左移、右移位运算(Java)
对于左移,右移,大多数人都知道下面两点左移将原数乘以2右移将原数除以2下面先来展示上面两点原数: 100整型是4字节32位,将100以整型的二进制表示二进制: 00000000 00000000 00000000 01100100100 >> 2二进制: 00000000 00000000 00000000 00011001 | 00解释: | 后面被剔除,前...
2019-05-08 19:46:14
10466
9
原创 nginx配置连接数及限制客户端请求
1.nginx配置连接数准备两台linux服务器,一台安装nginx,一台安装ApacheBench工具对nginx服务器进行测ApacheBench 是一个指令列程式,专门用来执行网站服务器的运行效能,特别是针对Apache 网站服务器。这原本是用来检测 Apache 网站服务器能够提供的效能,特别是可以看出Apache能提供每秒能送出多少网页。(1)准备第一台服务器(nginx)如...
2019-05-07 14:49:51
8795
1
原创 使用nginx解决跨域问题
先来介绍一下什么是同源策略同源(域名、协议、端口相同)策略是一种约定,是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,浏览器的正常功能将受到影响——如果非同源,在请求数据时,浏览器会在控制台报一个异常,提示拒绝访问所以域名不同,也就是非同源,会引起跨域问题。使用nginx解决跨域问题这里我创建了两个springboot工程进行测试,方便测试1.创建第一个工程这里给出依赖文件...
2019-05-07 08:45:03
3752
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人