自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(93)
  • 资源 (2)
  • 收藏
  • 关注

原创 Spring Framework爆出远程代码执行漏洞

Spring Framework 爆出远程代码执行漏洞!这个漏洞(CVE-2022-22965)是在2022年3月31日,Spring官网发布的,离现在已经一个多月了,可能还有很多开发者没有了解过。如果在JDK9环境下,攻击者可以通过利用SpringMVC的参数绑定功能,实现对目标程序写入恶意代码来达到入侵的目的。漏洞触发条件使用jdk9+版本使用Spring-webmvc并且使用了参数绑定功能(一般使用了spring-webmvc肯定用到了参数绑定)使用war包部署在servlet 容器中如a

2022-05-15 16:51:19 793

原创 如何在Spring环境中进行单元测试

对一个Java开发人员来说,单元测试是我们编码过程中不可或缺的一部分了。单元测试让你关注软件的基本单元的正确性,可以在编码阶段就提前暴露代码缺陷;单元测试具有执行速度快、可复用性的特点;单元测试可以让你进行代码重构时更加从容。所以越是核心的代码,进行单元测试越有必要。很多人觉得单元测试很重要,但是很多人都做不好单元测试,尤其是在集成了spring框架的项目,很多人都不知道怎么方便快捷的进行单元测试。在集成了spring的项目中你是否有这样的困扰,每次执行一个test case你就必须等待spring容器加

2022-05-04 16:10:53 1929

原创 什么?ConcurrentHashMap居然有bug

是的你没有看错,JDK8版本的ConcurrentHashMap真的有bug,而且不止一个。作为最基础的集合类,我们有必要了解这些bug,让我们使用时能有意识的避开。话不多说,我们直入主题。ConcurrentHashMap有两个bug,这两个bug都和computeIfAbsent方法有关。如果对相同的key执行多次computeIfAbsent,每次都会加锁。如果对一个key嵌套执行computeIfAbsent,而嵌套执行的key的hash值刚好相同时会导致死循环。我们都知道compute

2022-04-06 11:46:09 1126

原创 怎么创建一个自定义的Spring Boot Starter

前言封装是Java最大特性之一,在很多时候为了代码复用,我们会将代码抽象出一个内部的sdk。在Spring Boot项目中我们要怎么自定义一个Spring Boot Starter呢?这篇文章给你答案。首先你需要创建一个Spring项目,下面是我示例的pom.xml。然后创建你的AutoConfiguration类,同时在类上加上@Configuration注解如下图所示:我这个demo中创建了一个MyAutoConfiguration类,这个类希望注入一个UserManager的Java Be

2022-04-03 23:16:22 303

原创 iterm2跳板机自动登录脚本

前言现在要想访问公司服务器都必须通过跳板机再跳到目标服务器,这么做是运维人员为了安全性考虑和可以高效管理公司庞大的服务器集群。但是我们都知道安全性提高后必定降低我们日常工作的效率,必须先登录到跳板机,再选目标服务器,每次访问服务器都增加了半分钟的操作成本,作为最会偷懒的我来说写个跳板机自动登录脚本是非常必要的。expect 脚本我们可以用expect脚本来实现自动化交互任务,不需要人为干预。如果不用expect脚本我们登录跳板机需要人机交互来输入执行命令,而使用expect脚本可以根据程序提示模拟标准

2022-04-02 16:14:31 1615

原创 JVM垃圾回收器之深入理解CMS垃圾回收器

前言CMS垃圾回收器是本人理解最深刻的JVM垃圾回收器,CMS是首个可以与用户线程并发的低停顿收集器。随着技术的发展、JDK的更新迭代,CMS这个曾经被寄予厚望的并发垃圾回收器已经慢慢要被时代抛弃了,后面出来的G1,ZGC已经盖过了CMS的光芒,JDK9之后CMS甚至被抛弃为不建议使用。但是后来者都是踩在CMS肩膀上迭代的,你可以在G1中看到大量CMS代码的影子,同时现在国内很多公司依旧还在使用JDK8,无他就因为JDK8是最后开源的商用版本(不过JDK17又能用了。。。。),所以了解CMS垃圾回收器的原

2022-03-30 15:31:48 872

原创 JVM内存模型

前言很久没有写博客了,不是自己停止了思考,很多自己对架构、计算原理的领悟比较零散,并且很多都记录在电脑上没有发出来。最近刚好有点时间,就把之前的理解整理出来。今天两年前写的,关于对JVM基础的理解。JVM内存模型内存模型整体上分为程序计数器、JAVA虚拟机栈、本地方法栈、JAVA堆、方法区,其中JAVA堆和方法区是线程共享的,其余的是线程私有无线程安全问题。程序计数器程序计数器是JVM内占用内存比较少的一块区域,线程私有。当执行的是JAVA代码时,记录的值是JAVA字节码指令地址,可以看成是当前线

2022-03-11 14:25:54 575

原创 使用Jackson封装json序列化工具

大家都知道Jackson都是老牌的性能强劲的json序列化工具了,SpringMVC也是使用Jackson作为默认的序列化工具。我以前其实并不是使用Jackson而是国货之光–FastJson。本着支持国货,api简单的想法用了很长一段时间的FastJson,奈何国货不争气天天爆出安全漏洞,想着那些天大半夜爬起来升级版本的夜晚感动的流下了不争气的眼泪。。。。。所以没办法,转用稳定异常的Jackson的怀抱。但是Jackson有个不太友好的API使用,反正用起来就是没有FastJson的api调用来的方便,所

2020-08-08 23:50:14 618

原创 Netty4.x源码分析之EventLoop(二)

引言在上篇文章我们分析了EventLoop的两大核心NioEventLoopGroup和NioEventLoop,NioEventLoopGroup在其父类MultithreadEventExecutor中维护了NioEventLoop数组,而NioEventLoop首先内部持有线程对象,所以NioEventLoopGroup是个线程池,并且上篇文章我们也分析了NioEventLoop除了是个单...

2019-11-12 17:39:39 172

原创 Netty4.x源码分析之EventLoop(一)

引言上篇文章我们分析了ServerBootstrap的启动这部分源码,从整体的角度初步接触了netty的编码设计的魅力,今天我们来分析一下Netty里面另一个核心角色–EventLoop。用过netty的同学应该都或多或少知道Netty的高性能很大一部分功劳都在EventLoop的设计,尤其是EventLoop对Reactor线程模型的实现,大大提升了Netty的并发能力,接下来我们就来揭开Ev...

2019-11-11 17:12:07 204

原创 Netty4.x源码笔记之服务端启动

引言Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。因其基于异步的、事件驱动的特性,Netty具有很优异的性能,接下来我会展开一系列的Netty源码的学习,源码分析基于Netty版本V4.1.0。希望自己能有所收获。服务端启动示例在分析学习之前我们先按照国际惯例,我们先看看Net...

2019-10-30 18:59:49 170

原创 SpringBoot 结合AOP使用自定义注解

引言最近使用SpringBoot在做一个需求的时候,使用到了AOP(面向切面编程),Spring的AOP一直都是Spring宣传的一大特性,其实也没多高大上,就是使用JDK或者AspectJ做的动态代理。这个需求是做一个审计日志,使用AOP是最最合适不过了,使用AOP不用耦合在业务代码里,可扩展性好,但是传统的AOP定义切面,都是使用通配符,假设以后新加接口不在通配符里面,可能切点还要增加,设计...

2019-06-01 11:17:51 229

原创 java基础之ReentrantLock

引言之前我们说了java的synchronized同步关键字,解析了jdk1.6之后对其进行一系列优化原理分析,今天我们聊一聊java中另一个锁ReentrantLock。synchronized同步关键字实现同步或者说独占是通过JVM底层进行系统调用操作Mutex Lock(互斥锁)实现的,而ReentrantLock则是通过上层代码实现,某种意义上可以说是锁的软实现(当然还是需要通过调用大...

2019-03-20 11:29:45 437

原创 java基础之equals方法和hashcode方法

引言java基础系列之前已经剖析过好几个java里面比较关键的关键字了,今天我们来讲讲容易被人忽视的equals方法和hashcode方法。为什么说容易被人忽视,因为这两货就算你理他,也不会出什么问题,java的上帝类Object自带equals方法和hashcode方法,所以不用你操心,然鹅只要你根据业务需求来重写equals方法,就很有可能出错,今天我们就来看看这两个方法。equals方法...

2019-02-27 21:00:14 210

原创 java基础之final关键字

引言java关键字中final关键字绝对是我用的最勤最多的关键字之一。毕竟大量的常量定义总会带上final关键字,为什么常量定义会加上final关键字?final关键字如何用?为什么要用final关键字?接下来让我们聊聊final关键字。用法final关键字可以作用在类上,如果用来修饰类,则该类无法被继承。你如果使用final关键字修饰类,说明你已经很明确不希望该类被继承,不希望该类的方法...

2019-02-22 16:09:13 154

原创 java基础之synchronized关键字

引言在java中有两种加锁方式,一种使用同步关键字synchronized,另一种使用concurrent包下的Lock(比如我们所熟知的ReentrantLock)在我刚刚工作的时候很多前辈或者文章都说慎用同步关键字,太重了,很耗性能,与ReentrantLock相比性能没它好。但是好像是在jdk1.6之后(未验证过)特定对同步关键字的实现进行过优化,这两种锁性能已经不相上下了,甚至在某些情况...

2019-02-18 15:42:25 211 2

原创 SpringBoot 2.0 集成h2+liquibase进行单元测试

单元测试的重要性不必多说,大家都知道,在以前我做单元测试经常有一个很头疼的事情,已经写好的unit test经常会因为数据库中的某个数据被其他开发人员有心或无心删掉,导致unit test在之前还能通过,但是时间一长要重跑单元测试的时候就一堆不通过的。现在有了h2数据库,这个问题可以说可以完美解决。h2数据库是内存数据库,完美支持各大关系型数据库如:MySql、Oracle的语法,h2数据库简直就...

2019-01-21 22:11:31 1171

原创 记一次内存泄漏排查过程

引言最近公司一项目写完在进行压测,在压测过程中偶然top了几次,发现项目运行的进程占用的资源RES一直在缓慢增长。于是怀疑是存在内存泄漏。用通俗的话来讲内存泄漏是由于开发人员没有注意到内存管理,没有有效的进行内存回收导致的一部分内存无法被回收,同时在系统运行过程中会不断有新的相关内存占用,最终导致Out of Memory。这种情况在C++ programmer中是非常头疼的一件事,因为C++把内...

2018-04-29 21:43:21 544

原创 深入理解dubbo之服务引用

在之前说了一下dubbo的服务发布过程,其实严格意义上只说了一半吧,只把dubbo如何经过ProxyFactory的代理成一个Invoker,等待客户端调用的过程讲了一遍,而重要的Protocol.export方法略过去了,今天我将连带dubbo的comsumer客户端服务引用和Protocol机制来讲一讲。dubbo服务引用和上一篇文章一样,先来个demo<beans xmlns="http://

2017-11-30 19:07:03 3244 6

原创 elasticsearch实现中文分词和拼音分词混合查询+CompletionSuggestion

引言之前已经介绍了如何搭建elasticsearch服务端和简单的索引创建,和中文分词的支持。今天我们来说一说如何实现elasticsearch同时实现中文分词和pinyin分词。并且实现类似百度搜索栏的搜索建议的功能。混合查询实现混合查询有很多方式,这里介绍我认为是一个偷懒的方法,就是为你要拼音搜索的字段提供两个额外的字段,一个是全拼字段,一个是首字母缩写字段。我这里用的是官网的Employee的

2017-11-21 17:24:51 10129 6

原创 深入理解dubbo之服务发布源码分析

dubbo 是阿里开源的一个分布式服务框架,它的最大特点是按照分层的方式来架构,使各层之间充分解耦,并且它是无侵入性的,dubbo可以无缝与spring整合,更重要的是dubbo还提供了强大的容错和监控功能。 对于业务方来说,dubbo使用上手足够简单,调用过程对业务方透明,对开发人员友好。Demo在spring项目中添加如下pom包: <dependency> <group

2017-11-17 14:04:32 11418

原创 Spring Boot启动流程

引言早在15年的时候就开始用spring boot进行开发了,然而一直就只是用用,并没有深入去了解spring boot是以什么原理怎样工作的,说来也惭愧。今天让我们从spring boot启动开始,深入了解一下spring boot的工作原理。为什么用spring boot在使用一个东西或者一个工具之前,我们总是会问自己,我为什么要用?用他能给我带来什么好处? * 最大的好处就是spring b

2017-09-21 13:58:00 829

原创 elasticsearch5.3.0 索引创建及查询

引言上篇文章介绍了elasticsearch5.3.0服务器搭建,接下来说说elasticsearch的java客户端对数据的索引创建和对数据的查询。虽说现在es的api使用文档不少,但是5.3.0版本的太新了,许多都不兼容老版本,所以有了这篇博文。elasticsearch允许HTTP Restful的方式进行数据访问和操作,也同样允许通过JAVA API来访问服务器,HTTP Restful方式

2017-06-30 16:49:59 1044

原创 elasticsearch5.x服务器搭建

引言之前与搜索有关的需求都是使用solrCloud实现的,最近公司在做日志监控的时候使用并没有用solr而是使用了好评更甚的elasticsearch。之前本来就一直想了解es,现在刚好有机会学习,特此记录下学习的过程。what is elasticsearchelasticsearch(以下使用缩写es代替)是一个基于lucene的分布式、近实时的全文搜索引擎。它还是一个分布式非关系型数据库,被e

2017-06-21 20:07:58 2103

原创 java基础之如何正确使用volatile

volatile关键字在java多线程中有着比较重要作用,volatile主要作用是可以保持变量在多线程中是实时可见的,是java中提供的最轻量的同步机制。可见性在Java的内存模型中所有的的变量(这里的变量是类全局变量,并不是局部变量,局部变量在方法内并没有线程安全的问题,因为变量随方法调用完成而销毁)都是存放在主内存中的,而每个线程有自己的工作内存,每次线程执行时,会从主内存获取变量的拷贝,对变

2017-04-16 15:23:45 5880 3

原创 与spring结合的策略模式

策略模式是23种设计模式之一,客户端通过制定多个算法并且封装,使得不同场景可以使用不同的策略算法。使得程序降低了耦合提高代码的复用性。接下来通过一个简单的实例来说明在实战中如何使用(即使是业务逻辑也是可以用设计模式的)。例子很简单,就是通过同一个保存的service来做不同类型产品的保存。如下图:接下来看具体实现:BaseObj:public abstract class BaseObj imple

2017-04-05 18:58:29 5812 2

原创 spring boot使用redis

首先加配置到application.properties中:spring.redis.host=dev-redis.hostspring.redis.password=111111spring.redis.port=6379spring.redis.timeout=30000spring.redis.pool.max-active=200spring.redis.pool.min-idle

2016-12-09 15:21:47 471

原创 使用intellj ide搭建spring+mybatis时无法识别mapper.xml文件

解决办法:往maven的pom.xml文件的下添加以下内容,原因是在编译的时候默认没有添加xml文件,所以需要加上以下内容 src/main/java **/*.xml src/main/resources **/*.*

2016-10-25 19:16:54 1819

原创 自己写一个urlEncoder和urlDecoder

public class Escape { private final static String[] hex = { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F", "10", "11", "12

2016-07-21 18:24:26 450

原创 使用HttpClient4.5 PoolingHttpClientConnectionManager 提交Http请求

使用连接池的好处大家都知道http连接是基于tcp的,而tcp创建连接需要三次握手,断开连接四次挥手,如果我们不使用连接池,那么每发出一个请求,就需要三次握手和四次挥手,而三次握手和四次挥手都是耗资源的操作。试想如果频繁的发出请求,性能是不是会是个瓶颈。所以HttpClient在4之后就出现了连接池的概念,当请求结束并不是直接断开连接,而是返回给连接池方便下次调用。代码示例 private

2016-07-20 10:08:57 13436

原创 使用Apache HTTP发送POST/GET请求

POST请求方法一,直接传入Instreampublic static String post(String url, InputStream instream){ try { //该Request是org.apache.http.client.fluent.Request; HttpEntity entity = Request.Post(u

2016-07-07 18:10:22 3263 1

转载 使用token在服务器端避免表单的重复提交

原文章地址利用同步令牌来解决重读提交的基本原理1 用户访问包含表单的页面  服务器在这次会话中 创建一个session对象  并产生一个令牌值 将这个令牌值作为隐藏输入域值 随表单一起发送到客户端 同时将令牌值保存到session中2 用户提交页面 服务器端首先判断请求参数中的令牌值和Session中保存的令牌值是否相等 如果相等 则清楚session的令牌值 然后执行

2016-06-28 12:13:20 1830

原创 使用URLConnction发送HTTP/HTTPS请求

在java原生包中提供两种方式来模拟客户端发送http/https请求,第一种是httpClient;第二种是URLConnction。今天我们使用URLConnction来实现一下。前提首先我们要知道发送http/https请求的前提是什么,发送http请求需要我们构造request的几个必要的参数。第一个URL,第二个http的一些属性设值,比如ContentType、Method、Connec

2016-06-26 15:20:29 1611

原创 使用原生HTML5上传文件

最近碰到个需求,需要使用js上传文件,一般上传文件都是使用表单,并为使用过js上传,这次在这记录一下。     之前网上说使用jquery插件jqueryajaxupload.js。用下来发现坑巨多,果断舍弃,换用原生的HTML5来做上传。具体思想就是创建一个FormData对象,将file标签的值设进formdata对象里面去,再使用xmlhttprequest上传,同时在xhr中添加监听器

2016-06-21 14:06:58 528

原创 CentOS下部署javaWeb项目

# 在项目编码阶段结束,测试结束后就是项目部署了,一般都会将项目部署到更为稳定的Linux操作系统的服务器上,因为Linux的优秀特性,首先Linux是多用户多进程操作系统而Window则是单用户伪多用户不适合服务器。并且Linux下kernel panic几年一遇,也可以好几年不关机,一两年一次磁盘清理。接下来就好好说说在Linux下如何部署javaWeb项目。在部署javaWeb项目前需要在服

2016-06-19 17:32:56 1347

原创 JDK8新特性--Stream

JDK8新特性--StreamJDK8StreamJDK每次更新都会让人惊讶不已,每次更新最主要的目的就是给开发人员提供更佳的开发编程体验,像JDK1.4以后提出的NIO将IO的方式从同步阻塞提升到了性能更佳的同步非阻塞方式。这次JDK1.8更新最大的亮点除了lamada表达式之外,还有极其惊艳的Stream。这里的Stream可不是IO里面的OutputStream或

2016-05-21 18:57:17 3222

原创 spring boot文件的上传下载

spring boot 引入”约定大于配置“的概念,实现自动配置,节约了开发人员的开发成本,并且凭借其微服务架构的方式,一出来就占据大片开发人员的芳心。然而对于刚开始使用它的人来说是比较不习惯的,因为大部分的配置从开发人员可见变成了相对透明了,要想进一步熟悉还需要关注源码,对于spring boot 新人来说使用是比较吃力的。为了记录自己对spring boot的学习,同时也可以对正在

2016-04-13 14:45:56 9524

原创 BIO、NIO、AIO

java到现在jdk1.8,已经经历了三代io,第一代也就是从jdk1.1到1.4使用的是BIO,BIO是select的,也就是同步阻塞的IO方式,到jdk1.4-1.7jdk采用全新的NIO,newIO是poll的,NIO是同步非阻塞的,而到了jdk1.7-1.8出现了AIO,而AIO使用的是epoll方式,该方式最大亮点就是异步非阻塞。同步和异步     同步异步说的是消息

2016-01-26 11:50:17 558

转载 Lucene实践:全文检索的基本原理

一、总论根据http://lucene.apache.org/java/docs/index.html 定义:"Apache Lucene(TM) is a high-performance, full-featured text search engine library written entirely in Java. It is a technology suitable

2016-01-03 15:17:28 531

原创 springboot构建solr查询实例

通过spring boot构建solr查询实例spring boot曾经使用spring我们需要各种各样的配置web.xml,配置springapplication.xml。真的很繁琐,要建一个项目框架出来,确实不太容易。而现在spring社区推出spring boot。完全不需要去管那些xml的配置了,springboot采用约定优于配置的思想,通过你项目所需的d

2015-12-23 18:42:06 12124

使用ehcache的工具类

使用ehcahe时自己做的工具类,方便以后使用

2015-07-30

最新的dwr的jar包

最新的dwr的jar包,要用到dwr技术必须的jar包。

2015-01-03

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除