<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[csdn_0xFFFF的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/csdn_0xFFFF</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; csdn_0xFFFF]]></copyright><item><title><![CDATA[Spring 系列框架的中文文档]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/128878931</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/128878931</guid><author>csdn_0xFFFF</author><pubDate>Sat, 04 Feb 2023 09:41:48 +0800</pubDate><description><![CDATA[Spring Boot/Spring Security/Spring Cloud 最新中文文档。]]></description><category></category></item><item><title><![CDATA[SpringBoot动态修改Logger的日志级别]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/121693975</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/121693975</guid><author>csdn_0xFFFF</author><pubDate>Fri, 03 Dec 2021 10:57:28 +0800</pubDate><description><![CDATA[springboot默认使用logback作为日志框架。logback提供了获取logger，修改logger日志级别的接口。
这里用一个Controller演示：获取logger，动态修改logger级别

actuator 其实也提供了管理日志的endpoint

环境 &amp;  版本

Java17
SpringBoot 2.6.1

TestController
package io.springboot.example.web.controller;

import java.util.Lin]]></description><category></category></item><item><title><![CDATA[SpringBoot整合Spring-Data-Jpa + QueryDsl以及使用案例]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/121675191</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/121675191</guid><author>csdn_0xFFFF</author><pubDate>Thu, 02 Dec 2021 13:26:13 +0800</pubDate><description><![CDATA[这些年我接触/学习过得ORM框架或库也有一箩筐了。

dbutils
mybatis
sql2o
beetlsql
hibernate
cayenne
spring-data-jpa
querydsl

我觉得springboot应用中最得心应手的利器，还是 spring-data-jpa + queryds。但是它好像在国内不怎么流行，看国内的开源项目，工作遇到的项目基本都是mybatis/mybatis-plus。写不完的xml和mapper，用不完的代码生成。
这种单表CRUD的ORM框架，不能灵活的]]></description><category></category></item><item><title><![CDATA[使用SpEL记录操作日志的详细信息]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/120869622</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/120869622</guid><author>csdn_0xFFFF</author><pubDate>Wed, 20 Oct 2021 16:45:42 +0800</pubDate><description><![CDATA[操作日志
操作日志就是记录用户请求了什么接口，干了啥事儿。常见且简单的实现就是通过spring的aop + 自定义注解完成。
在HandlerMethod方法上标识自定义注解，在注解上设置一些自定义的基本属性，例如字符串属性 operation: “删除了用户信息”。
在Aop切面中，获取到这个注解，读取到预定义的信息，配合当前用户的Token，那么就确定了执行操作的用户和执行的操作。就可以创建一条“操作日志”。
不够详细
这种方式，也有一个缺点显而易见，就是日志的内容，被固定住了。我们只能知道“谁删除了用]]></description><category></category></item><item><title><![CDATA[HttpClient使用管道流提交Multipart请求]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/120453749</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/120453749</guid><author>csdn_0xFFFF</author><pubDate>Fri, 24 Sep 2021 14:05:50 +0800</pubDate><description><![CDATA[HttpClient 是JDK11提供的一个全新HTTP客户端Api，超级好用。
Multipart 请求
HttpClient 并没有提供 Multipart 请求体的构建Api。但是可以使用apache的开源httpmime库来进行构建。
&lt;!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.]]></description><category></category></item><item><title><![CDATA[SpringBoot + FFmpeg实现一个简单的M3U8切片转码系统]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/116944286</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/116944286</guid><author>csdn_0xFFFF</author><pubDate>Mon, 17 May 2021 18:57:14 +0800</pubDate><description><![CDATA[使用大名鼎鼎的ffmpeg，把视频文件切片成m3u8，并且通过springboot，可以实现在线的点播。
想法
客户端上传视频到服务器，服务器对视频进行切片后，返回m3u8，封面等访问路径。可以在线的播放。
服务器可以对视频做一些简单的处理，例如裁剪，封面的截取时间。
视频转码文件夹的定义
喜羊羊与灰太狼  // 文件夹名称就是视频标题
  |-index.m3u8  // 主m3u8文件，里面可以配置多个码率的播放地址
  |-poster.jpg  // 截取的封面图片
  |-ts      // 切]]></description><category></category></item><item><title><![CDATA[Fastjson处理枚举]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/116675644</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/116675644</guid><author>csdn_0xFFFF</author><pubDate>Tue, 11 May 2021 23:39:38 +0800</pubDate><description><![CDATA[Fastjson
这玩意儿不多说，Alibaba出品，出过几次严重的安全漏洞，但是依然很流行。这里写一下它怎么处理枚举。
&lt;!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;com.alibaba&lt;/groupId&gt;
    &lt;artifactId&gt;fastjson&lt;/artifactId&gt;
    &lt;]]></description><category></category></item><item><title><![CDATA[在SpringBoot中缓存HTTP请求响应体(实现请求响应日志的记录)]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/116503674</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/116503674</guid><author>csdn_0xFFFF</author><pubDate>Fri, 07 May 2021 21:54:55 +0800</pubDate><description><![CDATA[缓存请求响应体的目的
把一个HTTP的请求，响应信息完整的纪录到日志。是一种常见有效的问题排查，BUG重现的手段。
但是流这种东西，有一个特点就是只能读取/写入一次，不能重复。下一次读写，就是一个空的流，为了实现流的重用，就很有必要，把读取和写入的数据缓存起来，  可以在某个地方，再一次的读取。
实现的思路

HttpServletRequestWrapper
HttpServletResponseWrapper

上面2个类，熟悉Servlet的都知道，这俩就是Request和Response的装饰模式实]]></description><category></category></item><item><title><![CDATA[Go的Pipe应用场景，往服务器提交multipart请求]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/112745126</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/112745126</guid><author>csdn_0xFFFF</author><pubDate>Sun, 17 Jan 2021 14:46:47 +0800</pubDate><description><![CDATA[multipart 请求是多部件请求体，一般来多用于上传文件等场景，由于文件上传，请求体会比较大，就不适合在内存中构建完整的请求体（例如使用bytes.Buffer）。
这种情况就可以考虑使用Pipe，它会返回一个Writer和一个Reader，管道流，顾名思义，一头读，一头写。读取磁盘文件，写入网络，并不会缓存在内存中。非常适合这种场景。
func Pipe() (*PipeReader, *PipeWriter) {
	p := &amp;pipe{
		wrCh: make(chan []byte),]]></description><category></category></item><item><title><![CDATA[在SpringBoot中使用Redis的zset统计在线用户信息]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/111565460</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/111565460</guid><author>csdn_0xFFFF</author><pubDate>Tue, 22 Dec 2020 19:54:13 +0800</pubDate><description><![CDATA[统计在线用户的数量，是应用很常见的需求了。如果需要精准的统计到用户是在线，离线状态，我想只有客户端和服务器通过保持一个TCP长连接来实现。如果应用本身并非一个IM应用的话，这种方式成本极高。
现在的应用都趋向于使用心跳包来标识用户是否在线。用户登录后，每隔一段时间，往服务器推送一个消息，表示当前用户在线。服务器则可以定义一个时间差，例如：5分钟内收到过客户端心跳消息，视为在线用户。
在线用户统计的实现
基于数据库实现
最简单的办法，就是在用户表，添加一个最后心跳包的日期时间字段 last_active。服务]]></description><category></category></item><item><title><![CDATA[在SpringBoot中使用RedisTemplate重新消费Redis Stream中未ACK的消息]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/109743727</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/109743727</guid><author>csdn_0xFFFF</author><pubDate>Tue, 17 Nov 2020 15:20:31 +0800</pubDate><description><![CDATA[消费组从stream中获取到消息后，会分配给自己组中其中的一个消费者进行消费，消费者消费完毕，需要给消费组返回ACK，表示这条消息已经消费完毕了。
当消费者从消费组获取到消息的时候，会先把消息添加到自己的pending消息列表，当消费者给消费组返回ACK的时候，就会把这条消息从pending队列删除。（每个消费者都有自己的pending消息队列）
消费者可能没有及时的返回ACK。例如消费者消费完毕后，宕机，没有及时返回ACK，此时就会导致这条消息占用2倍的内存（stream中保存一份, 消费者的的pendi]]></description><category></category></item><item><title><![CDATA[在Java中实现Zip文件的压缩与解压缩]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/109067125</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/109067125</guid><author>csdn_0xFFFF</author><pubDate>Wed, 14 Oct 2020 10:19:50 +0800</pubDate><description><![CDATA[zip这里就不多说了，在网上找了很多代码，都觉得实现不够优雅，所以自己写了一个工具类。

解压zip文件
指定的文件进行zip压缩，
对指定的目录进行zip压缩

ZipUtils
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import j]]></description><category></category></item><item><title><![CDATA[RestTemplate与Gzip压缩]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/109037040</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/109037040</guid><author>csdn_0xFFFF</author><pubDate>Mon, 12 Oct 2020 21:10:09 +0800</pubDate><description><![CDATA[Gzip 是一种压缩算法，服务器经常通过这个算法来压缩响应体，再响应给客户端，从而减少数据体积，提高传输速度。客户端再通过Gzip解压缩，获取到原始的数据。因为需要压缩计算，所以会耗费额外的CPU资源。
Gzip 与 HttpHeader
对于压缩，这个行为来说，客户端与服务器都要经过协商。只有使用了同一种压缩算法，才能正确的解码出数据。http协议中定义了相关的header
Content-Encoding
是一个实体消息首部，用于对特定媒体类型的数据进行压缩。当这个首部出现的时候，它的值表示消息主体进行]]></description><category></category></item><item><title><![CDATA[在浏览器中异步下载文件监听下载进度]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/108589917</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/108589917</guid><author>csdn_0xFFFF</author><pubDate>Mon, 14 Sep 2020 22:44:55 +0800</pubDate><description><![CDATA[在浏览器中异步下载文件，其实就是把服务器响应的文件先保存在内存中。然后再一次下载到磁盘。第二次下载过程，就是把内存的数据IO到磁盘，没有网络开销。速度极快。
之所以要先保存在内存，主要是可以在下载开始之前和下载结束后可以做一些业务逻辑（例如：校验，判断），还可以监听下载的进度。
演示
这里演示一个Demo，在点击下载摁钮后，弹出加loading框。在读取到服务器的响应的文件后。关闭loading框。并且在控制台中输出下载的进度。

有点像是监听文件下载完毕的意思，也只能是像。从内存IO到磁盘的这个过程，JS]]></description><category></category></item><item><title><![CDATA[SpringBoot中的所有配置属性（中文）]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/108531393</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/108531393</guid><author>csdn_0xFFFF</author><pubDate>Fri, 11 Sep 2020 11:41:01 +0800</pubDate><description><![CDATA[SpringBoot所有配置项的中文说明（使用Deepl翻译），由 SpringBoot中文社区 整理提供。
目录

1. Core properties
2. Cache properties
3. Mail properties
4. JSON properties
5. Data properties
6. Transaction properties
7. Data migration properties
8. Integration properties
9. Web properties
10]]></description><category></category></item><item><title><![CDATA[Springboot应用中设置Cookie的SameSite属性]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/108322674</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/108322674</guid><author>csdn_0xFFFF</author><pubDate>Mon, 31 Aug 2020 15:44:49 +0800</pubDate><description><![CDATA[Cookie除了key和value以外有几个属性。

httpOnly 是否允许js读取cookie
secure 是否仅仅在https的链接下，才提交cookie
domain cookie提交的域
path cookie提交的path
maxAge cookie存活时间
sameSite 同站策略，枚举值：Strict Lax None

其他的都很熟悉了，最后一个是 Chrome 51 开始，浏览器的 Cookie 新增加了一个  SameSite 属性，用来防止 CSRF 攻击和用户追踪。

关于S]]></description><category></category></item><item><title><![CDATA[客户端解析服务器响应的multipart/form-data数据]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/108244117</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/108244117</guid><author>csdn_0xFFFF</author><pubDate>Wed, 26 Aug 2020 17:28:09 +0800</pubDate><description><![CDATA[multipart/form-data，多部件请求体。这个请求体比较特殊，它可以拆分为多个部件，每个部件都有自己的header和body，最常用的地方就是：客户端文件上传，因为有多个部件，在上传文件的时候，还可以在body中添加其他的数据。json，form。。。
一般来说，都是客户端发起multipart/form-data请求 ，服务器进行解析。而且这种东西的编码解码工作一般都是由底层的容器/框架完成。开发根本不必关心。但是我最近遇到了一个需求：

服务器响应multipart/form-data（包含]]></description><category></category></item><item><title><![CDATA[MyBatis通过TypeHandler自动编解码对象的Json属性]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/108056275</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/108056275</guid><author>csdn_0xFFFF</author><pubDate>Mon, 17 Aug 2020 15:07:47 +0800</pubDate><description><![CDATA[mysql从5.7.版本开始支持json列。它本质上仍然是一个字符串，比起直接用varchar来说，它有专门对于json的的检索，修改方法。更加的灵活。
在jdbc规范中，还没json类型的定义。所以对象一般都是用String属性，映射数据库的json列。在存储和读取的时候，需要自己完成json的序列化和反序列化。
在使用MyBatis的框架，可以通过定义TypeHandler来自动完成Json属性的序列化和反序列化。
演示一个Demo
这里使用Gson的JsonElement作为对象的Json属性对象。我]]></description><category></category></item><item><title><![CDATA[在SpingBoot中使用Redis对接口进行限流]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/107876964</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/107876964</guid><author>csdn_0xFFFF</author><pubDate>Sat, 08 Aug 2020 11:21:03 +0800</pubDate><description><![CDATA[一个基于Redis实现的接口限流方案，先说要实现的功能

可以限制指定的接口，在一定时间内，只能被请求N次，超过次数就返回异常信息
可以通过配置文件，或者管理后台，动态的修改限流配置

实现的思路
使用 Hash 存储接口的限流配置
request_limit_config 	"/api2" : {"limit": 10, "time": 1, "timeUnit": "SECONDS"}

hash中的key就是请求的uri路径，value是一个对象。通过3个属性，描述限制策略

limit 最多请求次数]]></description><category></category></item><item><title><![CDATA[在SpringBoot App中使用GoogleReCaptcha3过滤非法的请求]]></title><link>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/107826725</link><guid>https://blog.youkuaiyun.com/csdn_0xFFFF/article/details/107826725</guid><author>csdn_0xFFFF</author><pubDate>Wed, 05 Aug 2020 22:21:59 +0800</pubDate><description><![CDATA[现在的应用中对于登录，注册，短信验证码。。。这些场景来说，验证码真的是必不可少。随着技术的发展，也使得验证码从当初的图形验证码，发展到今天的滑块，倒立文字点击，数学计算，手势滑动，拼图，刮图。。。等等各种花样，总之一个目的，阻止机器人的访问。
验证码这玩意儿，确实给用户带来了很不好的体验，很多应用的验证码确实玄乎的很让人让人抓狂。
ReCaptcha
这是谷歌的一个验证码程序，它免费，强大，很多世界级别的应用都在使用它（靠谱）。
它现在有2个比较流行的版本！！
ReCaptcha 2，它长这样

这玩意儿，]]></description><category></category></item></channel></rss>