自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(131)
  • 收藏
  • 关注

原创 Netty (10)-WebSocket

搭建服务基本配置参考。本篇仅介绍实现WebSocket服务器的关键代码。

2024-03-05 09:28:46 515 2

原创 spring boot2 (40)- JWT token

本篇介绍JWT token的生成和解析的基本方法。

2023-02-26 14:37:50 302 1

原创 spring boot2 (39)- 统一返回结果和ResponseBodyAdvice

本篇介绍rest接口,如何返回统一的状态码、消息、数据等。

2023-02-18 10:30:02 391

原创 docker(5)-数据卷

容器运行时会产生一些数据,在容器内部不便于管理,而且容器删除后数据也会被删除。数据卷可以将容器中的动态数据直接存储到宿主机上,独立于容器。挂载自定义目录docker run -id -v /root/data1:/root openjdk:8-v:指数据卷,用于存储数据。 /root/data1:/root:挂载宿主机的/root/data1目录为数据卷,对应容器的/root目录。在容器中操作/root目录内容时,实际会反映到数据卷,反过来也是一样。 挂载多个数据卷,可以使用多次-v。

2022-09-04 14:30:06 255

原创 docker(4)-容器

导出导入容器import export进入镜像docker run -it openjdk:8 bash 打开一个新的终端运行镜像,并执行bash,此时这个容器会一直运行,就像在宿主机的命令行一样,可以直接执行java -version命令。

2022-07-31 15:19:38 782

原创 docker(3)-镜像

基本概念镜像:可理解成是可执行的程序包,它是静态只读的,可以以文件的形式迁移。 基础镜像:比如centos镜像,是由官方发布的,是一个虚拟化的centos系统。可以它为基础构建自定义镜像。 自定义镜像:项目发布需要在centos服务器上配置java环境,复制项目文件运行等。这个过程也可以在centos基础镜像内进行,将其再次打包,就升级为了一个自定义的项目镜像。这个镜像可以以文件的形式复制到服务器上,服务器只要预装了docker环境,即可一键启动镜像,完成项目上线。而不需要在服务器进行项目的环境配置

2022-07-16 20:11:01 2506

原创 docker(2)-基本概念和hello-world

基本概念镜像:可理解成是可执行的程序包,它是静态只读的,可以以文件的形式迁移。 基础镜像:比如centos镜像,是由官方发布的,是一个虚拟化的centos系统。可以它为基础构建自定义镜像。 自定义镜像:项目发布需要在centos服务器上配置java环境,复制项目文件运行等。这个过程也可以在centos基础镜像内进行,将其再次打包,就升级为了一个自定义的项目镜像。这个镜像可以以文件的形式复制到服务器上,服务器只要预装了docker环境,即可一键启动镜像,完成项目上线。而不需要在服务器进行项目的环境配置

2022-06-28 11:35:38 347

原创 docker(1)-安装基于centos7.9

添加阿里云docker仓库用yum命令安装docker,默认是从国外下载安装文件,网速很成问题。这里设置从阿里云下载。先安装yum-utils,即可使用yum-config-manager添加阿里云仓库yum -y install yum-utilsyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装最新版本yum install docker-ce

2022-06-19 16:06:36 204

原创 mysql (3) 悲观锁、乐观锁

本篇以如何防止库存超卖为例 ,介绍如何使用悲观锁和乐观锁,存储引擎为innodb。并发超卖问题销售时,先查询出id=100的商品的库存数量quantity,只要数量大于0,说明还有库存,销售后将数量减1,如下。SELECT quantity FROM t WHERE id=100;#判断库存大于0,则执行销售流程,否则中断业务UPDATE t SET quantity = quantity -1 WHERE id=100;问题:现在总共只有1件商品,有2个客户同时购买,同时查询库存时

2022-05-09 20:48:46 349

原创 spring boot2 (38)- @Validated 参数验证

本篇介绍spring boot如何验证传入的参数,是否合法。pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>独立参数验证此时,如果请求没有传参,abc为空,就会报500验证异常。

2022-03-12 14:33:14 894

原创 mysql (2) 覆盖索引、联合索引、回表

本篇介绍什么是覆盖索引,需要先了解上一篇聚集索引。

2022-03-05 10:56:51 723

原创 mysql (1) 聚集索引和非聚集索引

在mysql,聚集索引通常就是主键索引,非聚集索引通常就是普通索引,它们有什么区别?测试表先建一张表,有id、name和其他列。id建立主键索引,此时就是聚集索引。name建立普通索引,此时就是非聚集索引。聚集索引 (id)聚集的意思:在mysql中的索引的key及其数据行,在物理上是聚集存储在一起的。当找到某个索引的key值,也就找到了其行数据。如下图,找到了id 1,也就找到了第一行数据。非聚集索引 (name)非聚集的意思:name索引的key和行数据,在物理上没有聚集

2021-12-05 11:30:23 784

原创 Netty (9)-自定义连接参数

web项目中有session的概念,可以保存和获取每个用户的参数。netty也有类似功能,可以设置每个连接的参数。设置和获取参数每个参数需要设置一个attributeKey,使用比较简单,主要就是get和set。每个连接的attributeKey参数值是隔离的。public class MyHandler extends SimpleChannelInboundHandler<String> { AttributeKey<String> attributeKey

2021-05-15 11:05:35 1655

原创 Netty (8)-心跳机制

当客户端断开连接的时候,服务端需要及时的将这个连接关闭,以释放资源。所以通常每隔一定时间,客户端会向服务端发送心跳消息,证明自己的存在,否则服务端就认为客户端已经断开。IdleStateHandlerIdleStateHandler可用来检测心跳消息,三个参数分别为,读空闲时间、写空闲时间、读或写空闲,最后参数为时间单位,这里是分钟。即3分钟内没有读取到任何消息,即触发心跳超时事件。两个0表示禁用写空闲和读写空闲。 ch.pipeline().addLast("idleStateH

2021-04-11 11:46:07 368

原创 Netty (7)-半包和粘包

由于网络传输等原因,原始发出的消息和收到的消息可能不一致。可能多条消息粘在一起变成一条,也可能一条消息分了几条。本篇介绍几种解决方案。LineBasedFrameDecoder换行符分隔netty预设了一个解码器LineBasedFrameDecoder,参数为消息最大长度。收到消息时,会检查其中的换行符,将每个换行符之间的内容作为一条消息,交给MyHandler处理,客户端发过来的消息中必须包含换行符。 ch.pipeline().addLast(new LineBasedF

2021-03-13 10:24:20 226

原创 Netty (6)-解码和编码

前面说过,netty中收到的消息是ByteBuf类型,需要先将其转换为String,才能做进一步处理。发出消息时则需要先将String转为ByteBuf。解码器和编码器就是专门用来处理这种转换的,收到消息时解码,发出消息时编码。启动配置修改netty启动代码,现在有三个自定义类,MyDecoderHandler会将收到的字节消息解码为String,交给MyHandler处理。而MyHandler发出String消息时,会被MyEncoder编码为字节后再发出。 ServerBootstra

2021-02-21 09:17:50 364

原创 Netty (5)-ChannelPipeline

每个连接channel都会创建一个ChannelPipeline,它将多个ChannelHandler组装起来,当收发消息时,按一定顺序和规则将消息传播给各个ChannelHandler进行处理。入站处理和出站处理ChannelHandler分入站(ChannelInboundHandler)和出站(ChannelOutboundHandler),收到消息做入站处理,发出消息做出站处理。假如在ChannelPipeline中按顺序放入5个ChannelHandler,第1、3、5是入站,收到消息时按

2021-01-23 17:52:31 365 2

原创 spring cloud alibaba (7)- sentinel系统保护

之前的熔断、限流都是针对某一个资源的保护措施。而系统保护,是对整个系统的所有请求进行统一评估,统一限流。系统保护规则如下,每一条规则都是针对系统所有请求,设置不同的限流规则阀值,没有设置的规则默认不开启。其中一条规则达到阀值,整个系统都会被限流,直接拒绝请求并返回状态码429。 @PostConstruct private void initSystemRule() { List<SystemRule> rules = new ArrayList<>();.

2020-12-27 10:42:11 312 1

原创 spring cloud alibaba (6)- sentinel限流

当访问量过大,超出系统可能承受的范围时,就会把整个系统压垮。限流就是限制请求数量,超出数量的请求会被直接拒绝。定义限流资源和熔断一样,先定义一个要被限流的资源。 @SentinelResource(value = "hello") @RequestMapping("/hello") public String hello() throws Exception { Thread.sleep(10); return "业务处理"; }并发限流规则每秒之内,当hello资源的.

2020-12-06 13:17:14 202

原创 spring cloud alibaba (5)- sentinel熔断

当某个服务发生异常、响应慢等状态时,可能会影响到服务链中的所有服务,sentinel主要用于在发生状况时保护整体的可用性。pom.xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>定义保护资源首

2020-10-18 10:29:23 541

原创 spring cloud alibaba(4)-nacos配置中心

nacos不仅是注册中心,同时也是配置中心,其安装和集群等参考上一篇pom.xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>配置spring: application:

2020-09-05 10:01:30 378

原创 spring cloud alibaba (3)- nacos注册中心

nacos是spring cloud alibaba系列的组件,可用于替代eureka,用法更简便,功能更强大。安装执行下载地址:https://github.com/alibaba/nacos/releases 这里版本是1.3.1window系统 解压后双击nacos\bin目录的startup.cmd即可启动。如上图右边:默认端口8848,管理页面http://192.168.240.1:8848/nacos/index.html 登录用户/密码都是nacospom....

2020-08-15 10:53:03 182 1

原创 spring security 5 (12)-自动登录 rememberMe

当你登录了某个网站,过了好几天再去访问,可能会发现当前已经是登录状态,因为客户端一直保存着你的登录信息。虽然服务端session也可以维持用户会话状态,但是如果要维持一两周甚至更长时间,会造成服务端数据量太大。所以这里存储在客户端如cookie。rememberMe实现自动登录 protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().aut

2020-08-01 11:39:47 516

原创 spring boot2 (37)-分布式session和cookie跨域

本篇将介绍如何实现同域集群之间共享session,以及通过cookie跨域实现不同二级域名共享session。spring sessionsession通常是保存在服务器内存中的,而在集群环境下,用户第一次请求被发送到了A服务器,并写入session数据。第二次请求被发送到了B服务器,也写入session数据。之后的用户请求无论发送到A或B,其session数据都是有缺失的。spring session就是将session保存到数据库或缓存中,默认是redis。不管有多少服务器,都通过redis读写

2020-07-18 10:43:11 1299

原创 Netty (4)-内存回收和SimpleChannelInboundHandler

上一篇讲过,收发的数据都会先放入内存,并且这个内存还会是JVM以外的直接内存,所以需要我们手动去回收。

2020-06-19 15:24:59 923

原创 Netty (3)-ByteBuf、池、直接内存、16进制

传统IO在收发数据时,会阻塞当前线程,一边接收数据,一边对数据进行处理,处理完一段数据再继续接收下一段,再处理。而NIO会一次性将接收的所有数据,放入内存,处理数据时只需要读取内存,而IO线程被完全释放,这就是非阻塞。而被放入内存的数据在 netty中的表现形式就是本篇要讲的ByteBuf接收数据继续延用修改第1篇的代码,以下就是一次性接收数据放入内存(ByteBuf),并且打印出来的过程...

2020-05-05 15:19:32 2894 3

原创 Netty (2)-ChannelInboundHandlerAdapter入站事件

在第1篇,我们继承ChannelInboundHandlerAdapter后,即可收到消息并处理。本篇介绍其更多的用法基本概念Channel:可以理解为一个连接,每一个客户端连到服务器,都会有一个与之对应的Channel。 ChannelHandler:用来处理Channel中的各种事件。 ChannelInboundHandlerAdapter:入站ChannelHandler,即从...

2020-01-12 12:05:50 4470 1

原创 Netty (1)-回声服务器

Netty基于java nio(非阻塞) 实现,主要用于服务端与客户端之间的socket通信,其高性能号称单机可支持百万连接。其应用场景非常广泛,如物联网、分布式、聊天程序、网络游戏等。在基于java语言的项目中,要开发socket通信,netty目前几乎处于不可替代的地位。本篇将用netty实现一个简单的回声通信。pom.xml <dependency> &lt...

2020-01-05 09:18:12 686

原创 spring security 5 (11)-防止异地重复登录

本篇介绍如何实现一个用户只允许同时在一个地点登录基本配置 protected void configure(HttpSecurity http) throws Exception { http.formLogin().and() .sessionManagement() .maximumSessions(1).expiredUrl("/expired");maxi...

2019-04-21 13:01:52 3138 3

原创 spring security 5 (10)-digest摘要认证

摘要认证和基本认证一样,也是由http协议定义的,对用户使用的角度来说,它们并没有区别。但是摘要认证的安全性要高出很多,并且永远不会以明文传输密码。必须先理解基本认证基本配置spring security内置了DigestAuthenticationFilter,封装了摘要认证逻辑,不需要你去构建AuthenticationManager。但是构建UserDetailsService是必不...

2019-04-14 11:29:46 2935 1

原创 spring security 5 (9)-httpBasic基本认证

httpBasic是由http协议定义的最基础的认证方式。每次请求时,在请求头Authorization参数中附带用户/密码的base64编码,参考base64。这个方式并不安全,不适合在web项目中使用。但它是一些现代主流认证的基础,而且在spring security的oauth中,内部认证默认就是用的httpBasic。httpBasic基本配置注意,这里没有配formLogin,也...

2019-04-07 10:42:11 13233 2

原创 spring security 5 (8)-密码加密BCryptPasswordEncoder

从spring security5开始,要求必须手动配置密码加密方式,spring官方推荐使用BCrypt加密,并明确指出sha和md5都是不安全的。本篇仅介绍BCrypt的用法。BCrypt加密与验证 BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); String result = encoder.en...

2019-03-31 11:54:54 6955

原创 spring security 5 (7)-异常处理

spring security主要有两大异常,登录时认证失败异常401,及请求时没有权限异常403。AuthenticationException(401)登录不成功,如密码错误等可抛出BadCredentialsException,它是AuthenticationException的子类。 if (!code.equals("123")) { ...

2019-03-24 09:33:35 5307

原创 spring security 5 (6)-认证过滤器

上一篇实现了自定义认证,但是要想彻底自定义整个认证流程,还差一个环节,即认证过滤器,它是认证的入口。本篇仍然以验证码为例,介绍自定义认证过滤器。自定义Authentication第4篇讲过,自定义过滤器的主要作用就是生成未认证Authentication,作为入参给AuthenticationManager认证。而在第5篇,根据AuthenticationProvider的support...

2019-03-17 08:34:04 3029

原创 spring security 5 (5)-自定义认证

第3篇讲过,用户登录时,系统会读取用户的UserDetails对其认证,认证过程是由系统自动完成的,主要是检查用户密码。而在现实中,登录方式并不一定是检查密码,也可能是验证码或其他,此时就需要自定义认证。AuthenticationProvider自定义认证逻辑在AuthenticationProvider的authenticate方法中完成,第4篇讲过,认证的入参是一个未认证Authen...

2019-03-10 09:49:44 5437 1

原创 spring security 5 (4)-认证流程

本篇介绍登录时的认证流程,及其相关的重要概念接口等,现在只需要有一个基本概念,以后将以此为基础介绍自定义配置,到时结合本篇会更加清晰。SecurityContext用户登录时,会将用户相关信息组装成一个Authentication对象,而SecurityContext的主要作用就是保存Authentication。并且 SecurityContext会通过session来维持状态,所以登录...

2019-03-02 16:00:26 2296

原创 spring security 5 (3)-UserDetails用户详情

用户登录时,系统会根据用户名,从存储设备查找该用户的密码及权限等,将其组装成一个UserDetails对象。并用UserDetails中的数据对用户进行认证,决定其输入的用户名/密码是否正确。从内存认证之前两篇我使用的是预置的user用户,以下则自定义一个user用户,密码123,权限是auth。user用户登录时会根据这些信息自动构建一个UserDetails,保存在内存中。 pass...

2019-02-24 19:26:03 13871

原创 spring security 5 (2)-Http请求权限

用户访问网站时,只能请求其有权限的网址,而不能手动去请求其权限以外的网址。基本配置以下配置了3个url请求时各需要的角色或权限,注意,这并不代表现实业务中的角色和权限,你可以根据需要自己决定。 public void configure(HttpSecurity http) throws Exception { http .authorizeRequests() //进行...

2019-02-17 08:40:54 3251

原创 spring security 5 (1)-formLogin表单登录和注销

表单登录即在form表单中输入用户名/密码,提交登录,在spring security中默认配置了formLogin来实现表单登录。pom.xml &lt;parent&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-parent&l...

2019-02-10 09:16:44 15932 4

原创 web安全 (2)-base64

base64在安全领域主要用于安全文件或数据的传输及存储,如一些专业的证书、密钥、token等,它们并不遵守任何文字编码,如果你用文字工具打开看,会看到很多特殊字符(乱码)。这些乱码在网上传输的时候,可能会被多个网关接收并转发,而有的网关并不一定能识别这些乱码,从而导致你的数据被错误处理或丢失。此时就需要先将乱码转换为大家都能识别的字符,才能正常传输,这种公认的字符就是base64编码。 64...

2019-02-02 10:44:39 510

空空如也

空空如也

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

TA关注的人

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