日常问题
文章平均质量分 67
滴哩哩哩滴哩哩哩哒哒
Keep coding
展开
-
记录解决maven无法下载snapshot快照库
maven的依赖管理方式中将依赖分为两种版本,一种是Release正式版本,还有一种Snapshot快照版本。一般版本号后面带有Release或者什么都没有的就是正式版本,而版本号后面带有snapshot的则是快照版本,如图:...原创 2021-04-14 20:07:49 · 6407 阅读 · 0 评论 -
登陆验证发展史(cookie认证->session认证->token认证->JWT,单系统登陆->多系统单点登陆)
登陆验证发展史有两条主线。在服务部署方式层面,早期的Web服务系统简单一般都是单系统,登陆的话就登陆这一个系统就好了,随着系统复杂性越来越高,一个大的系统往往由很多子系统组成,用户使用这个大系统时不可能一个一个地单独去登陆每个小系统,理想的是只要登陆上了这个大系统或者其中的一个小系统,其它所有小系统都不需要再输密码什么的登陆了,直接访问,所以登陆验证就从单系统登陆演进为多系统的单点登陆。而在验证方式层面,经历了cookie认证->session认证->token认证->JWT的发展史。原创 2021-01-27 21:49:16 · 1302 阅读 · 0 评论 -
JAVA NIO的三要素(Buffer/Channel/Selector)、四种Channel事件SelectionKey以及Netty中的零拷贝串联理解
JAVA NIO全称是Java non-blocking IO或者Java New IO。在之前的文章中(https://blog.csdn.net/weixin_42447959/article/details/107233189)提到过,NIO是IO理论思想,其中同步阻塞IO(Non-Blocking IO)演进为多路复用IO(Multiplexing IO),是IO理论思想的演进。JAVA NIO是NIO在JAVA领域的实现。JAVA NIO的三要素,即Buffer、Channel和Selecto原创 2021-01-06 19:14:49 · 977 阅读 · 0 评论 -
Tomcat利用Servlet处理请求的过程以及自定义Servlet
Tomcat利用Servlet处理请求的过程画了一张图,先上图:Servlet全称Java Servlet,没有对应中文翻译,都叫Servlet,其实就是Java编写的服务端程序。tomcat-embed-core包中有一个Servlet接口:它有很多实现类:其中我们最熟悉的就是Spring MVC里面的DispatcherServlet即前端控制器。回忆一下之前用XML是怎么配置DispatcherServlet的:配合了<servlet>和<servl.原创 2020-12-30 13:00:20 · 810 阅读 · 0 评论 -
BeanPostProcessor接口的理解
好久没有写博客了,看了一眼自己的文章列表,上次写还是8月份的时候,9月份转载了两篇。今天想起来写一篇,是因为自己纠正了对BeanPostProcessor接口的理解误区,写文章往往都是源于这种豁然开朗的灵感。不过今天又是孤陋寡闻的一天呢,一个知识点理解错了这么长时间居然都不自知。Bean的生命周期应该都很清楚,先贴这张图:这张Bean生命周期顺序图里大部分环节都是比较好理解的,比如setBeanName和setBeanFactory包括setApplicationContext,都是实现了对应的原创 2020-12-10 15:57:34 · 1318 阅读 · 0 评论 -
贴一张SQL关键字执行顺序图
但是,在实际当中,数据库不一定会按照 JOIN、WHERE、GROUP BY 的顺序来执行查询,因为它们会进行一系列优化,把执行顺序打乱,从而让查询执行得更快,只要不改变查询结果。原创 2020-08-19 14:39:20 · 238 阅读 · 0 评论 -
hutool的HttpUtil没有使用连接池,为此看了一下apache的httpclient是怎么实现连接池的
之前有篇文章介绍过这个甜甜的java工具类库hutool,也用过它导出excel,对它印象还不错。今天需要开发一个小工具jar,小工具的目的简单来说就是要去疯狂的远程调用几个http接口,开发之前首先就想到了用hutool试一下它里面的HttpUtil,因为小工具去调用远程http接口是要大量循环地进行的,是疯狂的,所以http连接池是必不可少的,为此特意去看了一下hutool的HttpUtil有没有应用连接池。打开了hutool的HttpUtil类,有很多重载的get()和post()方法,想知道原创 2020-08-14 14:29:58 · 7186 阅读 · 3 评论 -
发现了一个好玩的SQL函数-soundex()
今天又是孤陋寡闻的一天呢。先来看一段实操演示:首先我往表里插入了一行数据如图:没啥毛病,两个简单的String类型的字符串。然后我想查出这行,常规操作是这样对吧:今天学到了一个骚操作,看图:这两句貌似一顿乱传参数,Field_Value_Sign和Smythe没有半毛钱关系,Field_Sign和sim也只是像啊,居然也都能查询出来!这就是soundex()函数在其中起作用。soundex()函数简单点说就是返回表示字符串声音的一串字符,字符串的 SOUNDEX ..原创 2020-08-13 14:45:07 · 824 阅读 · 0 评论 -
转发一篇Redis五种数据结构详解,写的太棒太详细留下来慢慢消化
以下文章来源于公众号"非科班的科班",作者黎杜。本文脑图前言Redis是基于c语言编写的开源非关系型内存数据库,可以用作数据库、缓存、消息中间件,这么优秀的东西一定要一点一点的吃透它。话不多说,我们直接进入主题,很多人都知道Redis的五种数据结构包括以下五种: String:字符串类型 List:列表类型 Set:无序集合类型 ZSet:有序集合类型 Hash:哈希表类型 但是作为一名优秀的程序员可能不能只停留在只会用这五种类型进行c.转载 2020-07-23 14:56:30 · 277 阅读 · 0 评论 -
推荐一个甜甜的java工具类库-Hutool
今天又是孤陋寡闻的一天呢,偶然接触到了Hutool这个java工具类库,第一眼就觉得很有意思,把这个jar包下载下来之后看了一眼:哈哈哈,很是想看看它怎么让java语言甜甜的。先看一下jar包里面有什么东西:一顿点之后发现,Hutool其实就是帮我们封装了很多Util,比如我们想导出excel,里面有ExcelUtil,如果我们想用Json操作,里面有JsonUtil。还挺多,HttpUtil和ProxyUtil这些,很多都是我们平常能用得到的。先直接上手试一下吧,就试一下这个Exce.原创 2020-07-10 17:13:15 · 773 阅读 · 0 评论 -
理清同步/异步、阻塞/非阻塞、BIO、NIO/JAVA NIO、多路复用IO、AIO、select、poll和epoll,题目很乱但思路清晰。
题目看上去真的很乱,写之前先贴一张写之前理出来的思路图:题目里那些乱七八糟的名词都能在图里找到自己的位置了。 下面就是解释一下这张图了。从IO开始讲吧,先简单解释一下IO。其实IO这个概念真的很杂容易混淆,我理解的IO是分两个大概念的,即网络IO和磁盘IO。网络IO就是socket网络数据传输,磁盘IO就是磁盘文件读写这些。上图中的IO理论思想在网络IO和磁盘IO中都可以适用的,因为这两个有很多共同之处。为什么有共同之处呢?可以这么理解。磁盘IO就是文件读写嘛,文件是在磁盘上的要读到内存中,原创 2020-07-10 10:24:29 · 604 阅读 · 1 评论 -
将一个maven项目和第三方依赖一起打成没有main-class的普通jar
最近开发的项目需要给一个jdk1.7的项目写一个SDK,而且这个jdk1.7的项目也不是maven项目,是那种原始的java web。既然这样,想法就有了。开发这个SDK的时候我是肯定要用maven的,打包的时候可以打成一个普通jar包,并且把第三方依赖也打进jar包中,还要注意开发编译得用jdk1.7,这样就可以直接提供这个jar包给他们,也不会出现jdk版本问题。思路清晰就开始开发一个demo了。将一个maven项目和第三方依赖一起打成没有main-class的普通jar,这种场景其实挺多的,比如很原创 2020-06-30 18:59:54 · 1665 阅读 · 1 评论 -
利用AOP简单实在的防止系统垂直越权
还是前几篇博客中提到过的项目,接盘过来后一直在重构它。重构的过程中,JIRA就给我发了个警告:天呐真的是会给我找事情,那就趁着这次重构顺便解决它吧。一个成熟的系统权限控制都会用角色去控制用户权限,比如admin管理员和operate操作员两个角色,如果系统中某个功能只能管理员使用,但是如果操作员也能使用的话就是垂直越权。防止垂直越权...原创 2020-06-16 15:40:56 · 2181 阅读 · 2 评论 -
com.baomidou.mybatisplus在XML中写insert/update的时候要注意有没有parameter
事情是这样的,最近在重构旧项目,项目中有一段逻辑调用了Oracle的存储过程,类似于这样:这段存储过程的SQL是在数据库里面的,非常长,我是很不喜欢在程序中使用存储过程的,这些逻辑也可以放在程序中啊。看不过眼就把这段长长的SQL复制到XML中了,就成了这样:这是insert,还有update:太长了还用了begin/end就都截图了一部分。可以看出来这段存储过程执行的时候是不需要任何参数的,所以这里<update>和<insert>标签页没有写parame..原创 2020-06-02 15:21:18 · 4044 阅读 · 0 评论 -
在SpringBoot中弃用自带的StandardServletMultipartResolver更换为CommonsMultipartResolver也有坑
还是上篇传统Spring项目换SpringBoot框架中的一个问题,先描述一下问题:整和SpringBoot后系统中的文件上传都不能用了,统统报错如下:大致就是Failed to parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: Stream closed这样,通过异常栈信息可以看出当时使用的文件上传解析器是CommonsMultipart原创 2020-05-28 15:07:46 · 3919 阅读 · 3 评论 -
传统Spring项目换SpringBoot的问题记录
起因就是组内旧项目也要接入现有的微服务部署,该项目大致上就是后台MVC和前端JSP写在了一起,还用了一堆shiro、mybatis-plus这些组件,整改过程想必问题很多,所以写一篇博客,事无巨细,都简单地记录下来。原项目目录结构如图: 被我一顿换后,改了pom.xml文件加了启动类,有点boot项目的样子了,项目结构如图:主要就是把webapp里面的stati...原创 2020-05-15 16:34:21 · 872 阅读 · 0 评论 -
话不能说得太绝对不然下不了台(单点登录Filter排除部分url)
其实这次的问题解决分分钟按以往习惯是不值得啰嗦一篇博客的,但这次着实有点下不了台,归根结底还是自己对单点登录的jar包不了解,所以想记录一下,以后好好看源码再说话,即:事情是这样的,现在公司项目集成单点登录不奇怪,负责的一个Spring项目用的这个jar包。老项目了,过滤器是配置在web.xml中,<filter-mapping>配置的时候也是"/*"全部拦,如下:<filter> <filter-name>CasSingleSignOutFilte原创 2020-05-13 16:29:41 · 823 阅读 · 0 评论 -
SpringBoot项目启动过程源码终于整体捋了一遍(完结)
上篇看到了refreshContext()方法:refresh()分析完了,接下来看一下这个shutdownHook,撸源码之前先介绍一下它。我们做开发的经常需要考虑服务宕机的情况,OOM内存溢出也好,断电断网也好,甚至用户直接点了叉强制退出了。如果服务正在进行很重要的操作处理很重要的数据这个时候进程挂掉了,那之前的活岂不是白干了,甚至还会导致系统bug。所以这个时候我们希望在服务宕机...原创 2020-04-15 19:53:17 · 670 阅读 · 1 评论 -
SpringBoot项目启动过程源码终于整体捋了一遍(九)
上篇介绍了run()方法中context三连中的prepareContext()方法,先贴一下这个三连:这篇的重点是refreshContext()方法,先看一下这个方法:接下来的方法比较多,想着自己写有点懒了,看到其他文章中直接在源码中添加注释的方法还挺直观的,接下来就当一下搬运工,自己也补充了部分地方,下面的原文出处:作者:ygxing链接:https://www.ji...原创 2020-04-15 18:47:04 · 807 阅读 · 0 评论 -
SpringBoot项目启动过程源码终于整体捋了一遍(七)
上篇看了一部分的run()方法,先贴一下run()方法:上篇看到了listeners.starting();介绍了SpringBoot启动时的事件发布机制,并且遗留了一个问题,即初始化SpringApplication时设置初始化器setInitializers()有什么用,这篇继续往下看:利用参数args构建了一个DefaultApplicationArguments对象,顾名思...原创 2020-04-03 16:05:53 · 913 阅读 · 0 评论 -
SpringBoot项目启动过程源码终于整体捋了一遍(六)
截止上篇,关于SpingBoot的启动流程终于看完了如何初始化SpringApplication,内容还是挺多的足足写了5篇。并且过程中遗留了一个问题,即初始化SpringApplication的时候设置初始化器setInitializers()和设置监听器setListeners()在启动流程中起着什么作用。带着遗留问题这篇开始看初始化完SpringApplication之后的run方法,先...原创 2020-04-02 15:37:06 · 602 阅读 · 0 评论 -
孤陋寡闻的我刚知道怎么debug远程服务
之前在IDEA中debug一般也就在本地代码本地起个服务跑一跑,孤陋寡闻的我今天才知道还可以用本地代码去debug远程服务,其实debug远程服务这个应用场景说多不多说少也不少,举个例子,比如你想复现一个bug,可以本地没有数据,在本地代码上debug怎么都复现不了,可是bug在测试服务器上疯狂复现,这时候就想能不能用本地的代码,测试服务器上的数据来debug,其实我每次都是这么想的,有办法啊,直...原创 2020-03-26 15:06:20 · 226 阅读 · 0 评论 -
SpringBoot项目启动过程源码终于整体捋了一遍(五)
这篇继续看初始化SpringApplication的时候如何设置初始化器的,上篇看到了getSpringFactoriesInstances()方法,先贴出来:上篇撸了第一行,理了java的类加载相关,继续往下看:注释说使用名称并确保唯一,以防止重复,这些names被放进了Set集合,原来大佬们也喜欢用Set防止重复啊,继续看这些names怎么来的,这个SpringFactori...原创 2020-03-26 13:51:06 · 515 阅读 · 0 评论 -
SpringBoot项目启动过程源码终于整体捋了一遍(四)
上篇分析了初始化SpringApplication时是如何推断应用类型的,并且问题依然遗留着,即初始化SpringApplication的时候resourceLoader为null怎么拿类加载器。这篇带着这个问题继续往下撸源码,还是把SpringApplication的构造方法贴一下:继续往下看:setInitializers()方法即设置初始化器,ApplicationCon...原创 2020-03-24 18:40:14 · 1193 阅读 · 2 评论 -
SpringBoot项目启动过程源码终于整体捋了一遍(三)
上篇分析到了构造SpringApplication的过程,为了了解这个主源类primarySources,大致撸了一遍bean加载的过程。同时还遗留了一个问题,已经看到初始化SpringApplication的时候esourceLoader是为了拿类加载器,那如果resourceLoader为null怎么办呢,总不能不要类加载器吧,这篇带着这个问题继续看SpringApplication的初始化过...原创 2020-03-23 20:11:52 · 314 阅读 · 0 评论 -
SpringBoot项目启动过程源码终于整体捋了一遍(二)
上一篇写到run()方法分两步,即:1.new SpringApplication() 利用主源类primarySources初始化SpringApplication类2.调用SpringApplication的run()方法启动项目,并传递参数args。也提到启动的时候主源类primarySources可以有多个,那就有一个问题了,这个primarySources为什么还可以有多个呢...原创 2020-03-21 15:37:29 · 1322 阅读 · 2 评论 -
没有设置jdbcType的话Mybatis不能将null设置为sql语句的参数值(Oracle)
今天遇到一个问题,数据库用的oracle,先简单描述一下,Mybatis不能将null值设置为待执行sql语句的参数,再详细描述一下发现问题的经过:之前用Mybatis时,在xml文件中写SQL的时候,常会用到<if test="">这样的判断条件,如下:一大堆,之前对<if>标签的理解本质上就是看条件拼SQL,条件成立了就拼上这一句,不符合条件就不要这句了SQ...原创 2020-03-21 12:18:04 · 1709 阅读 · 0 评论 -
SpringBoot项目启动过程源码终于整体捋了一遍(一)
写在前面:这几天撸这段源码过程中,发现好多东西之前都忽视了,所以决定连载几篇,把之前漏掉的、现在想起来了的,都整理总结下来。Spring Boot项目启动过程这个问题过于经典,之前也是能说上来一点,但是说实话,源码都是一个片段一个片段的看过,没有系统性地连起来,这几天从头开始捋了一遍,也不是闲的无聊,是因为确实遇到了一个问题。问题是这样的:现在项目部署一般都分测试环境和生成环境甚至更多,不...原创 2020-03-17 19:10:36 · 1031 阅读 · 0 评论 -
Redis 3.0版本前后,分片与集群的实现
首先这篇博客对Redis的集群部署工作不予介绍,因为最近的开发涉及到了使用jedis客户端操作Redis,借此机会总结梳理一下jedis客户端操作Redis的三种模式:单机模式(Jedis)、分片模式(ShardedJedis)和集群模式(JedisCluster)。首先当然是把依赖引进来:<!-- redis客户端 --><dependency> &...原创 2020-01-08 22:02:05 · 433 阅读 · 0 评论 -
由传统IO演化至零拷贝的过程
零拷贝(Zero-Copy)用于在数据读写过程中减少不需要的CPU拷贝,CPU就那么几个,减少它的负担自然可以提高处理效率。数据传输有本地的文件拷贝和通过socket进行文件传输两种,两者区别不大,只是文件数据最终的去向仍然是本地磁盘还是网卡的区别,这里以socket文件为例介绍传统IO演化至零拷贝的过程。介绍零拷贝之前,可以先看一下传统IO,借此熟悉一些相关概念,先上图:首先要知道操...原创 2019-12-13 15:01:21 · 914 阅读 · 4 评论 -
就想画个详细点的线程状态图
原创 2019-11-26 11:18:23 · 466 阅读 · 0 评论 -
Spring Boot项目入口mainClass竟然不是ApplicationRun!
emmmm标题有点今日某条的,其实我想表达的意思是Spring Boot项目打成的jar包,程序的真正入口main方法并不是我们写的ApplicationRun启动类里的。当然,这看怎么理解了,如果非要说这是我自己写的main方法它就是入口这也没错,只不过你这main方法前面人家jar包还有一个自己的入口呢。先说我是怎么发现这个问题的吧,最近写了一个小应用,当然用Spring Boot开发的,...原创 2019-11-21 11:49:36 · 1285 阅读 · 0 评论 -
持续更新MySQL和ORACLE实操区别
最近由于项目需要用上了oracle,几天感受下来感觉区别还是挺多的,方方面面,所以打算开一篇博,不详述,简单地持续更新。由于对Oracle不是很熟悉,如有错误谢谢指正:1.MySQL是可以设置主键自增的,但在Oracle里想让主键自增要先选一个number类型字段作为主键,然后自己写序列和触发器,总之要自己动手。2.两种数据库的索引类型都可选很多种,MySQL的默认引擎innoDB是可以选...原创 2019-11-04 15:19:55 · 167 阅读 · 0 评论 -
利用Optional类省去烦人的非空判断
上一篇梳理了一下利用流操作集合的一些方法,其中提到了Optional类。它也是JDK8的新特性之一,可以顺便总结下。开发过程中为了避免程序跑出空指针异常,往往需要在代码中做大量的非空判断,Optional类最大的作用就是省去这些if-else非空判断,当然它和lombok的@NotNull不一样,先看一下它的主要用法:要注意的是用of()方法初始化, 如果传了null,即of(null...原创 2019-10-25 21:58:25 · 906 阅读 · 0 评论 -
集合的流操作和函数式编程总结以便用时查阅
集合的流操作和函数式编程都是JDK8的新特性,重语法,记住就行,记不住的就多用几遍,用习惯了开发效率会提高不少。试试这些新特性前先做了数据初始化的准备工作,接下来的例子都是用这几个集合,如下:准备好了那就一个一个来了。1.matcha即为集合中元素的变量,记住a -> 这种写法就行,返回布尔型。2.findfindFirst()返回第一个元素这没啥可说...原创 2019-10-25 21:28:26 · 197 阅读 · 0 评论 -
单例模式真香
之前对单例模式的印象停留在了各种骚操作保证只有一个实例,一个就一个呗,天天CRUD也想不到有什么用的地方呀,除了准备面试前会写一写,好像还真没怎么写过单例模式。今天着实真香了一把,不过香在单例模式的另一个特性。是这样的,项目客户端和服务器之间的通信框架是Netty,客户端与服务器绑定成功后可以从ChannelFuture中拿到与Netty服务端建立的通道Channel,往里面写数据就可以将消息...原创 2019-10-24 23:54:20 · 171 阅读 · 0 评论 -
Base64编码简单总结
有人说Base64编码是一种加密算法,其实本质上就是一个“二进制到文本”的编码方法,规则是将3个字节(24位)转为4个字符,这样就方便了二进制数据的传输,例如图片等。编码过程中可能出现最后还剩下1个或者2个字节,不够24位,这种情况就会在后面补0,经常会在Base64编码后的字符串结尾处看到“=”,这就是补0的结果。...原创 2019-05-13 14:52:45 · 412 阅读 · 0 评论 -
一次Mybatis部分源码阅读
Mybatis是ORM层的解决方案,其特性包括延迟加载,缓存等。既然是ORM层的解决方案,本质上当然是帮助我们更合理的去访问数据库,所以延迟加载和缓存打算以后再看,今天只阅读了部分源码,梳理一下Mybatis是如何帮助我们操作数据库的。可以先梳理一下如果没有Mybatis,我们是怎么利用JDBC去访问数据库的,这么几个步骤:1.Class.forName()加载驱动。这儿有个题外话,为什么...原创 2019-05-30 09:14:35 · 187 阅读 · 0 评论 -
转载一篇精简的缓存击穿,穿透和雪崩的博客
作者:每天进步一点点yes来源:CSDN原文:https://blog.csdn.net/kongtiao5/article/details/82771694版权声明:本文为博主原创文章,转载请附上博文链接!---------------------一、缓存处理流程 前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并...转载 2019-05-24 10:59:05 · 167 阅读 · 0 评论 -
Redis为什么设计成单线程的
其实这个问题可以延伸出两个问题:1.Redis为什么单线程也能这么快?2.Redis为什么不设计成多线程的?一个一个回答:一.为什么单线程也能这么快?1.几乎是完全基于内存的数据读写,虽然也有数据持久化策略。2.正是因为单线程,避免了线程之间的上下文切换的开销,也没有大量锁机制的线程等待。3.线程模型为反应堆模型,NIO多路复用。二.为什么不设计成多线程?1.R...原创 2019-05-29 07:29:00 · 689 阅读 · 0 评论