- 博客(40)
- 收藏
- 关注
原创 SpringSecirity(四)——用户退出
因为JWT是无状态的,去中心化的,在服务器端无法清除,服务器一旦进行颁发,就只能等待自动过期 才会失效,所以需要redis配合才能完成登录状态的记录。实现思路: 登录后在redis中添加一个白名单,把认证成功的用户的JWT添加到redis中。保存至redis时,加上截止时间。(2)退出后台代码实现。
2024-10-11 14:35:06
672
2
原创 SpringSecurity(三)——自定义优化器
创建exception包,在exception包下创建自定义CustomerAuthenticationException类,继承 AuthenticationException类/*** 自定义 认证 验证异常类*/
2024-10-11 14:31:17
541
原创 SpringSecurity(二)——授权实现
在SpringSecurity中,会使用默认的FilterSecurityInterceptor来进行权限校验。在 FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication,然后获取其中的 权限信息。当前用户是否拥有访问当前资源所需的权限。所以我们在项目中只需要把当前登录用户的权限信息也存入Authentication。然后设置我们的资源所需 要的权限即可。
2024-10-11 11:57:26
623
原创 SpringSecurity(一)——认证实现
修改UsernamePasswordAuthenticationFilter上图最右边的授权部分。@Autowiredreturn R.ok().message("登陆成功").data("token", jwt);return R.error().message("登陆失败");(1)在接口中我们通过AuthenticationManager的authenticate方法来进行用户认证,所以需要在 SecurityConfig中配置把AuthenticationManager注入容器。
2024-10-11 11:43:19
1349
2
原创 Java 并发(五)—— 线程池
继承关系7个核心参数(核心线程数大小:不管它们创建以后是不是空闲的。线程池需要保持 corePoolSize 数量的线程,除非设置了 allowCoreThreadTimeOut。(最大线程数:线程池中最多允许创建 maximumPoolSize 个线程。(存活时间:如果经过 keepAliveTime 时间后,超过核心线程数的线程还没有接受到新的任务,那就回收。(keepAliveTime 的时间单位。workQueue。
2024-08-17 14:22:12
1127
原创 Java 并发(四)—— volatile 和 synchronized
如果我们将一个变量使用volatile修饰,这就指示 编译器,这个变量是共享且不稳定的,。
2024-08-14 08:42:54
795
原创 Java 并发(一)—— 线程
start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。但是,直接执行 run() 方法,会把 run() 方法当成一个 main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。对象,这仅仅只是线程体,也就是提供给线程执行的任务,并不属于真正的Java线程,它们的执行,最终还是需要依赖于new Thread()。这种状态下,线程将不会消耗CPU资源,不会参与锁的竞争。类似,都会让当前线程交出CPU权限,让CPU去执行其他的线程。
2024-08-09 15:41:01
992
原创 Netty 总结与补充(十)
Netty 是一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。网络传输方式问题。
2024-08-05 15:02:15
971
原创 Netty 进阶(九)—— WebSocket协议开发
Netty入门(六) WebSocket协议开发_websocketserverprotocolhandler-优快云博客
2024-08-05 14:35:13
282
原创 Netty 进阶(七)—— 心跳机制
所谓 心跳, 即在 TCP长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线,以确定TCP连接的有效性。Netty是基于IdleStateHandler实现的,IdleStateHandler是ChannelDuplexHandler的一个实现类,可以对读写IO进行空闲检测。readerIdleTimeSeconds, 读超时. 即当在指定的时间间隔内没有从 Channel 读取到数据时, 会触发一个 READER_IDLE 的 IdleStateEvent 事件.
2024-08-05 13:54:06
1508
原创 Netty 必知必会(六)—— 粘包拆包问题
当接收方的 SO_RCVBUF 被填充满时,此时 window size=0,发送方不能再继续发送数据,要等待接收方 ack 消息,以获得最新可用的 window size。TCP 是以字节流的方式来处理数据,一个完整的包可能会被 TCP 拆分成多个包进行发送,也可能把小的封装成一个大的数据包发送。,TCP 的全双工的工作模式以及 TCP 的滑动窗口便是依赖于这两个独立的 buffer 以及此 buffer 的填充状态。很好理解,在每一个你认为是一个完整的包的尾部添加指定的特殊字符,比如:\n,\r等等。
2024-08-02 22:29:57
731
原创 Netty 必知必会(五)—— 核心组件
Netty 框架中所有的 I/O 操作都为异步的,因此我们需要 ChannelFuture 的 addListener()注册一个 ChannelFutureListener 监听事件,当操作执行成功或者失败时,监听就会。如果服务器发出的消息称作“出站”消息,服务器接受的消息称作“⼊站”消息。那么消息的“出站/⼊站”就会产⽣。这个对象可以看作是⼀个异步操作的结果的占位符,它将在未来的某个时刻完成,并提供对其结果的访问。两者的区别在于,前者不会释放消息数据的引⽤,⽽后者会释放消息数据的引⽤。
2024-08-02 21:08:41
806
原创 Netty 必知必会(四)—— Channel-Pipeline 责任链
ChannelHandlerContext 提供了一系列 fireXXX 方法,用于将事件传播给链中的下一个处理器。例如:fireChannelRead(Object msg):当新的数据被读取时,调用这个方法将事件传递给下一个入站处理器。如果开发者在自定义的 ChannelHandler 中重写了某个事件处理方法,并且没有调用对应的 fireXXX 方法,那么事件的传播就会在该处理器处终止。Netty 的 Pipeline 管道的设计,就采用了责任链设计模式。负责保存处理器的状态,并且提供了方法来访问。
2024-08-01 20:45:44
770
原创 Netty 必知必会(三)—— ByteBuf
Java提供了ByteBuffer 作为它 的字节容器,但是这个类使⽤起来过于复杂,⽽且也有些繁琐。ByteBuf是Netty框架中的一个关键类,专门设计来处理字节数据,旨在替代Java标准NIO库中的ByteBuffer。相较于ByteBuffer,ByteBuf引入了更高效的数据操作方式和更丰富的API支持。其核心优势在于支持,这些特性共同作用使得ByteBuf在数据处理方面的性能大大超越了传统的ByteBuffer。
2024-08-01 17:19:28
984
原创 Netty必知必会(二)—— I/O 模型和线程模型
决定着用什么样的通道将数据发送给对方,BIO、NIO 或者 AIO,IO 模型在很大程度上决定了框架的性能。决定着数据报如何读取?读取之后的编解码在哪个线程进行,编解码后的消息如何派发,Reactor 线程模型的不同,对性能的影响非常大。
2024-08-01 15:16:15
921
原创 Netty必知必会(一)—— 零拷贝技术
直接内存也称为堆外内存,也就是不受JVM控制的内存。Netty 的接收和发送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接内存进行 Socket 读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行 Socket 读写,JVM 会将堆内存 Buffer 拷贝一份到直接内存中,然后才写入 Socket 中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。
2024-08-01 10:41:54
1398
原创 最清楚的 BIO、NIO、AIO 详解!
为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为和。用户进程(应用程序)想要执行 IO 操作的话,必须通过来间接访问内核空间。
2024-07-26 21:10:05
1227
原创 Cookie、Session、Token 、JWT、单点登录 详解
狭义上,我们通常认为 session 是「种在 cookie 上、数据存在服务端」的认证方案,token 是「客户端存哪都行、数据存在 token 里」的认证方案。对 session 和 token 的对比本质上是「客户端存 cookie / 存别地儿」、「服务端存数据 / 不存数据」的对比。
2024-07-23 09:11:23
1784
原创 密钥交换算法(RSA、ECDHE)
HTTPS 是应用层协议,需要先完成 TCP 连接建立,然后走 TLS 握手过程后,才能建立通信安全的连接。因为考虑到性能的问题,所以双方在加密应用信息时使用的是对称加密密钥,而对称加密密钥是不能被泄漏的,为了保证对称加密密钥的安全性,所以的协商,这个工作就是密钥交换算法负责的。不同的密钥交换算法,TLS 的握手过程可能会有一些区别。
2024-07-22 20:55:58
1699
原创 用户登录安全是如何保证的?如何保证用户账号、密码安全?
比较容易想到的就是利用不可逆加密散列函数MD5(string),用户在注册输入密码的时候,就存储MD5(password)值,并且在WEB端先进行MD5(password),然后将密码传输至后台,与数据库中的密文进行比较(PS:MD5函数在指定位数的情况下,对相同字符串运算值相同)。保证数据库内用户的密码信息安全在传输过程中只能截取到用户的密文,该密文被MD5加密后无论如何也不能破解简单高效,执行以及编码难度都不大,各种语言都提供MD5支持,开发快。
2024-07-22 17:33:06
2231
原创 @SpringBootApplication 注解及源码 详解
Configuration注解本质上是一个@Component注解,所以,被@Configuration注解标注的配置类本身也会被注册到IOC容器中。同时,@Configuration注解也会被@ComponentScan注解扫描到。当某个类被@Configuration注解标注时,说明这个类是配置类,可以在这个类中使用@Bean注解向IOC容器中注入Bean对象,也可以使用@Autowired、@Inject和@Resource等注解来注入所需的Bean对象。前面四个不用说,是定义一个注解所必须的。
2024-07-19 18:34:59
1301
原创 HTTPS 的加密过程 详解
发送方对内容计算出一个「指纹」,然后同内容一起传输给对方。接受方对内容也计算出一个「指纹」,然后跟发送方发送的「指纹」做一个比较。如果「指纹」相同,说明内容没有被篡改,否则就可以判断出内容被篡改了。常见摘要算法:MD5(消息摘要算法第五版)输入任意长度的原文,经过处理(见下),输出为128位的信息(数字指纹);不同的输入得到的不同的结果(唯一性);MD5属不属于加密算法MD5不可逆,因为本质使用的是hash算法,在计算过程中原文的部分信息是丢失了的。
2024-07-19 18:10:58
1038
原创 Java 和 SpringBoot 中的设计模式 详解
假如有一结果api结果返回值的类Person,其在代码中频繁被使用。这两种使用方法的弊端有:(1):当只需要部分参数的时候需要再定义个构造函数(比如失败的情况只需要code和message,结果肯定是空,因此不需要data),且一旦参数较多,则;(2);Lombok插件的@Builder注解。
2024-07-19 15:53:52
978
原创 MySQL 命令总结篇-思维导图
一些常用命令以思维导图形式总结在这里了,掌握这些进行MySQL基本操作绝对没问题,加油!友友们可以根据这些思维导图进行知识总结。
2024-05-30 18:00:42
519
原创 Linux--查看网络性能指标
带宽延时吞吐率PPS当然,除了以上这四种基本的指标,还有一些其他常用的性能指标,比如:网络的可用性并发连接数丢包率重传率。
2024-02-27 17:35:25
2771
1
原创 Linux Python 定制篇(Python 开发平台 Ubuntu)
Ubuntu (友帮拓、优般图、乌班图)是一个以桌面应用为主的开源 GNU/Linux 操作系统,Ubuntu 是基于 GNU/Linux,支持 x86、amd64(即 x64)和 ppc 架构,由全球化的专业开发团队(Canonical Ltd)打造的。专业的 Python 开发者一般会选择 Ubuntu 这款 Linux 系统作为生产平台.
2024-01-01 15:51:57
533
原创 Linux 大数据定制篇(Shell编程)
设计者事先设计已经定义好的变量,可以直接使用$$ // 当前进程的进程号PID// 后台运行的最后一个进程的进程号// 最后一次执行命令的返回状态。若=0,证明上一个命令正确执行;若!=0(具体哪个数由命令自己决定),证明上一个命令执行不正确Action;funname [值] // 调用直接写函数名八、参考B站 韩顺平一周学Linux。
2023-12-28 15:56:46
462
原创 Linux 实操篇(进程管理)重点
进程分为前台与后台,前台进程是用户目前屏幕上可以进行操作的,后台进程是实际在操作,但由于屏幕上无法看到的进程。一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,直到关机才结束。每个执行程序都称为一个进程,每一个进程都分配一个ID号(PID,进程号)。查看目前系统中,有哪些正在执行,以及它们的执行状况,可以不加任何参数。更加直观查看进程信息。
2023-12-08 16:18:02
487
原创 Linux 实用指令
1.init 数字 --》切换运行级别1.systemctl get-default --》查看当前运行级别2.systemctl set-default TARGET.target --》设置默认运行级别,重启后默认进入该级别。
2023-11-01 19:34:55
138
1
原创 Linux实操篇(远程连接、vim、关机重启、用户管理)
1.ifconfig --》查看IP地址2.ping 102.0.....(对方IP地址) --》查看是否可以连通对方IP3.reboot --》重启。
2023-10-31 21:54:16
372
2
原创 Linux目录结构
根目录ls --》查看当前目录下的所有文件(包括隐藏文件)常用1./bin(/usr/bin /usr/local/bin) --》存放最经常使用的命令2./home --》存放普通用户的主目录增加用户 >>> useradd 用户名 删除用户 >>> userdel -r 用户名。
2023-10-30 16:01:30
68
1
原创 Windows常用DOS命令总结
cd .. --》切换到上一级(..表示上一级)3.tree --》查看指定的目录下的所有子集目录。cd \ --》切换到根目录。5.echo --》输入内容到文件。2.rd --》删除目录。4.del --》删除文件。2.cd --》切换路径。1.md --》创建目录。
2023-10-30 10:43:02
113
1
原创 MixFormer代码调试(问题记录+解决)
然后就可以在anconda prompt里输入 python tracking/create_default_local_file.py。或者在pycharm里直接运行create_default_local_file.py。把create_default_local_file.py里的这三个参数改掉,不然会一直弹出。①修改文件名,直接输入anconda prompt,报错。③在pycharm里直接运行local.py,报错。(三)下载训练数据,看训练部分代码。作如下修改,把原来的注释掉。
2023-06-26 16:01:02
904
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人