- 博客(40)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 一个便于国内用户访问的 Spring Initializr
一个便于国内用户访问的 Spring Initializr官方 Spring Initializr ,在国外, 国内某些地区的用户经常出现无法打开的问题。SpringBoot中文社区 提供了一个便于国内用户访问的节点。https://start.springboot.io/...
2020-06-23 09:56:16
396
原创 SpringBoot动态修改Logger的日志级别
springboot默认使用logback作为日志框架。logback提供了获取logger,修改logger日志级别的接口。这里用一个Controller演示:获取logger,动态修改logger级别actuator 其实也提供了管理日志的endpoint环境 & 版本Java17SpringBoot 2.6.1TestControllerpackage io.springboot.example.web.controller;import java.util.Lin
2021-12-03 10:57:28
1217
原创 SpringBoot整合Spring-Data-Jpa + QueryDsl以及使用案例
这些年我接触/学习过得ORM框架或库也有一箩筐了。dbutilsmybatissql2obeetlsqlhibernatecayennespring-data-jpaquerydsl我觉得springboot应用中最得心应手的利器,还是 spring-data-jpa + queryds。但是它好像在国内不怎么流行,看国内的开源项目,工作遇到的项目基本都是mybatis/mybatis-plus。写不完的xml和mapper,用不完的代码生成。这种单表CRUD的ORM框架,不能灵活的
2021-12-02 13:26:13
908
原创 使用SpEL记录操作日志的详细信息
操作日志操作日志就是记录用户请求了什么接口,干了啥事儿。常见且简单的实现就是通过spring的aop + 自定义注解完成。在HandlerMethod方法上标识自定义注解,在注解上设置一些自定义的基本属性,例如字符串属性 operation: “删除了用户信息”。在Aop切面中,获取到这个注解,读取到预定义的信息,配合当前用户的Token,那么就确定了执行操作的用户和执行的操作。就可以创建一条“操作日志”。不够详细这种方式,也有一个缺点显而易见,就是日志的内容,被固定住了。我们只能知道“谁删除了用
2021-10-20 16:45:42
708
原创 HttpClient使用管道流提交Multipart请求
HttpClient 是JDK11提供的一个全新HTTP客户端Api,超级好用。Multipart 请求HttpClient 并没有提供 Multipart 请求体的构建Api。但是可以使用apache的开源httpmime库来进行构建。<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime --><dependency> <groupId>org.apache.
2021-09-24 14:05:50
431
原创 SpringBoot + FFmpeg实现一个简单的M3U8切片转码系统
使用大名鼎鼎的ffmpeg,把视频文件切片成m3u8,并且通过springboot,可以实现在线的点播。想法客户端上传视频到服务器,服务器对视频进行切片后,返回m3u8,封面等访问路径。可以在线的播放。服务器可以对视频做一些简单的处理,例如裁剪,封面的截取时间。视频转码文件夹的定义喜羊羊与灰太狼 // 文件夹名称就是视频标题 |-index.m3u8 // 主m3u8文件,里面可以配置多个码率的播放地址 |-poster.jpg // 截取的封面图片 |-ts // 切
2021-05-17 18:57:14
5684
2
原创 Fastjson处理枚举
Fastjson这玩意儿不多说,Alibaba出品,出过几次严重的安全漏洞,但是依然很流行。这里写一下它怎么处理枚举。<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <
2021-05-11 23:39:38
2011
原创 在SpringBoot中缓存HTTP请求响应体(实现请求响应日志的记录)
缓存请求响应体的目的把一个HTTP的请求,响应信息完整的纪录到日志。是一种常见有效的问题排查,BUG重现的手段。但是流这种东西,有一个特点就是只能读取/写入一次,不能重复。下一次读写,就是一个空的流,为了实现流的重用,就很有必要,把读取和写入的数据缓存起来, 可以在某个地方,再一次的读取。实现的思路HttpServletRequestWrapperHttpServletResponseWrapper上面2个类,熟悉Servlet的都知道,这俩就是Request和Response的装饰模式实
2021-05-07 21:54:55
934
2
原创 Go的Pipe应用场景,往服务器提交multipart请求
multipart 请求是多部件请求体,一般来多用于上传文件等场景,由于文件上传,请求体会比较大,就不适合在内存中构建完整的请求体(例如使用bytes.Buffer)。这种情况就可以考虑使用Pipe,它会返回一个Writer和一个Reader,管道流,顾名思义,一头读,一头写。读取磁盘文件,写入网络,并不会缓存在内存中。非常适合这种场景。func Pipe() (*PipeReader, *PipeWriter) { p := &pipe{ wrCh: make(chan []byte),
2021-01-17 14:46:47
378
原创 在SpringBoot中使用Redis的zset统计在线用户信息
统计在线用户的数量,是应用很常见的需求了。如果需要精准的统计到用户是在线,离线状态,我想只有客户端和服务器通过保持一个TCP长连接来实现。如果应用本身并非一个IM应用的话,这种方式成本极高。现在的应用都趋向于使用心跳包来标识用户是否在线。用户登录后,每隔一段时间,往服务器推送一个消息,表示当前用户在线。服务器则可以定义一个时间差,例如:5分钟内收到过客户端心跳消息,视为在线用户。在线用户统计的实现基于数据库实现最简单的办法,就是在用户表,添加一个最后心跳包的日期时间字段 last_active。服务
2020-12-22 19:54:13
828
原创 在SpringBoot中使用RedisTemplate重新消费Redis Stream中未ACK的消息
消费组从stream中获取到消息后,会分配给自己组中其中的一个消费者进行消费,消费者消费完毕,需要给消费组返回ACK,表示这条消息已经消费完毕了。当消费者从消费组获取到消息的时候,会先把消息添加到自己的pending消息列表,当消费者给消费组返回ACK的时候,就会把这条消息从pending队列删除。(每个消费者都有自己的pending消息队列)消费者可能没有及时的返回ACK。例如消费者消费完毕后,宕机,没有及时返回ACK,此时就会导致这条消息占用2倍的内存(stream中保存一份, 消费者的的pendi
2020-11-17 15:20:31
4440
原创 在Java中实现Zip文件的压缩与解压缩
zip这里就不多说了,在网上找了很多代码,都觉得实现不够优雅,所以自己写了一个工具类。解压zip文件指定的文件进行zip压缩,对指定的目录进行zip压缩ZipUtilsimport java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.nio.file.FileVisitResult;import java.nio.file.FileVisitor;import j
2020-10-14 10:19:50
261
原创 RestTemplate与Gzip压缩
Gzip 是一种压缩算法,服务器经常通过这个算法来压缩响应体,再响应给客户端,从而减少数据体积,提高传输速度。客户端再通过Gzip解压缩,获取到原始的数据。因为需要压缩计算,所以会耗费额外的CPU资源。Gzip 与 HttpHeader对于压缩,这个行为来说,客户端与服务器都要经过协商。只有使用了同一种压缩算法,才能正确的解码出数据。http协议中定义了相关的headerContent-Encoding是一个实体消息首部,用于对特定媒体类型的数据进行压缩。当这个首部出现的时候,它的值表示消息主体进行
2020-10-12 21:10:09
1055
原创 在浏览器中异步下载文件监听下载进度
在浏览器中异步下载文件,其实就是把服务器响应的文件先保存在内存中。然后再一次下载到磁盘。第二次下载过程,就是把内存的数据IO到磁盘,没有网络开销。速度极快。之所以要先保存在内存,主要是可以在下载开始之前和下载结束后可以做一些业务逻辑(例如:校验,判断),还可以监听下载的进度。演示这里演示一个Demo,在点击下载摁钮后,弹出加loading框。在读取到服务器的响应的文件后。关闭loading框。并且在控制台中输出下载的进度。有点像是监听文件下载完毕的意思,也只能是像。从内存IO到磁盘的这个过程,JS
2020-09-14 22:44:55
2352
原创 SpringBoot中的所有配置属性(中文)
SpringBoot所有配置项的中文说明(使用Deepl翻译),由 SpringBoot中文社区 整理提供。目录1. Core properties2. Cache properties3. Mail properties4. JSON properties5. Data properties6. Transaction properties7. Data migration properties8. Integration properties9. Web properties10
2020-09-11 11:41:01
588
原创 Springboot应用中设置Cookie的SameSite属性
Cookie除了key和value以外有几个属性。httpOnly 是否允许js读取cookiesecure 是否仅仅在https的链接下,才提交cookiedomain cookie提交的域path cookie提交的pathmaxAge cookie存活时间sameSite 同站策略,枚举值:Strict Lax None其他的都很熟悉了,最后一个是 Chrome 51 开始,浏览器的 Cookie 新增加了一个 SameSite 属性,用来防止 CSRF 攻击和用户追踪。关于S
2020-08-31 15:44:49
5259
8
原创 客户端解析服务器响应的multipart/form-data数据
multipart/form-data,多部件请求体。这个请求体比较特殊,它可以拆分为多个部件,每个部件都有自己的header和body,最常用的地方就是:客户端文件上传,因为有多个部件,在上传文件的时候,还可以在body中添加其他的数据。json,form。。。一般来说,都是客户端发起multipart/form-data请求 ,服务器进行解析。而且这种东西的编码解码工作一般都是由底层的容器/框架完成。开发根本不必关心。但是我最近遇到了一个需求:服务器响应multipart/form-data(包含
2020-08-26 17:28:09
3079
原创 MyBatis通过TypeHandler自动编解码对象的Json属性
mysql从5.7.版本开始支持json列。它本质上仍然是一个字符串,比起直接用varchar来说,它有专门对于json的的检索,修改方法。更加的灵活。在jdbc规范中,还没json类型的定义。所以对象一般都是用String属性,映射数据库的json列。在存储和读取的时候,需要自己完成json的序列化和反序列化。在使用MyBatis的框架,可以通过定义TypeHandler来自动完成Json属性的序列化和反序列化。演示一个Demo这里使用Gson的JsonElement作为对象的Json属性对象。我
2020-08-17 15:07:47
622
原创 在SpingBoot中使用Redis对接口进行限流
一个基于Redis实现的接口限流方案,先说要实现的功能可以限制指定的接口,在一定时间内,只能被请求N次,超过次数就返回异常信息可以通过配置文件,或者管理后台,动态的修改限流配置实现的思路使用 Hash 存储接口的限流配置request_limit_config "/api2" : {"limit": 10, "time": 1, "timeUnit": "SECONDS"}hash中的key就是请求的uri路径,value是一个对象。通过3个属性,描述限制策略limit 最多请求次数
2020-08-08 11:21:03
264
原创 在SpringBoot App中使用GoogleReCaptcha3过滤非法的请求
现在的应用中对于登录,注册,短信验证码。。。这些场景来说,验证码真的是必不可少。随着技术的发展,也使得验证码从当初的图形验证码,发展到今天的滑块,倒立文字点击,数学计算,手势滑动,拼图,刮图。。。等等各种花样,总之一个目的,阻止机器人的访问。验证码这玩意儿,确实给用户带来了很不好的体验,很多应用的验证码确实玄乎的很让人让人抓狂。ReCaptcha这是谷歌的一个验证码程序,它免费,强大,很多世界级别的应用都在使用它(靠谱)。它现在有2个比较流行的版本!!ReCaptcha 2,它长这样这玩意儿,
2020-08-05 22:21:59
847
原创 在springboot中使用Guava基于令牌桶实现限流
限流说详细了,名堂也多。这种算法那种算法,这种策略那种策略的。没有绝对的银弹。都要结合实际的场景来实现。最简单的,使用Google的Guava,几行代码。就可以优雅的对一个接口完成限流。令牌桶算法通俗的理解就是,有一个固定大小的水桶,水龙头一直按照一定的频率往里面滴水。水满了,就不滴了。客户端每次进行请求之前,都要先尝试从水桶里面起码取出“一滴水”,才能处理业务。因为桶的大小固定,水龙头滴水频率固定。从而也就保证了数据接口的访问流量。Guava谷歌的一个工具库,包含了大量的Java工具类,像has
2020-08-04 21:19:32
417
原创 springboot jwt redis实现token刷新
使用jwt的好处就是,服务器不需要维护,存储token的状态。服务器只需要验证Token是否合法就行。确实省了不少事儿。但是弊端也显而易见,就是服务器没法主动让一个Token失效,并且给Token指定了exp过期时间后,不能修改。配合redis,就可以轻松的解决上面两个问题token的续约服务器主动失效指定的token接下来,我会演示一个实现Demo初始化一个工程<parent> <groupId>org.springframework.boot</group
2020-08-03 21:40:59
1417
1
原创 使用spring-validation和@RequestParam(required = false)字符串默认值的校验问题
众所周知,使用@RequestParam(required = false) 封装请求参数的时候,如果客户端不提交参数,或者是只声明参数,并不赋值。那么方法的形参值,默认为null(基本数据类型除外)。一个Controller方法,有2个参数@GetMappingpublic Object update(@RequestParam(value = "number", required = false) Integer number, @RequestParam(value = "phone",
2020-07-29 22:34:47
4046
1
原创 使用@RequestBodyAdvice处理客户端的加密请求体
业务场景:客户端把json数据进行加密后,编码成Base64字符串,提交给服务器。服务器再进行解密。使用 @RequestBodyAdvice,可以在不修改任何Controller代码的前提下,轻松完成。之前写过一篇帖子,使用@ResponseBodyAdvice统一对响应的数据进行处理。演示了,使用ResponseBodyAdvice统一对响应给客户的json进行AES加密。RequestBodyAdvice 接口这个接口定义了一系列的方法,它可以在请求体数据被HttpMessageConve
2020-07-22 13:51:51
849
2
原创 玩儿转spring-data-jpa中jpql的投影查询
投影查询,就是仅仅检索表的部分字段。而不是粗暴的 SELECT * FROM...检索出所有列数据。例如检索用户余额信息的时候,就不需要检索用户的头像,创建日期等字段。节省了带宽传输和内存占用,也避免了可能暴露更多数据给客户端。这里先啰嗦一下jpql的一些注意点操作的是对象 @Entity, 不是表, 操作的是对象属性, 也不是表字段默认Entity名称就是类名称大写, 也可以通过修改 @Entity 属性的注解来修改不支持使用 `` 符号, 不支持在末尾添加分号: ;支持使用 AS 关键字起别
2020-07-16 11:43:15
295
原创 在SpringBoot中验证用户上传的图片资源
允许用户上传图片资源(头像,发帖)是APP常见的需求,特别需要把用户的资源IO到磁盘情况下,需要防止坏人提交一些非法的文件,例如木马,webshell,可执行程序等等。这类非法文件不仅会导致客户端图片资源显示失败,而且还会给服务器带来安全问题。通过文件后缀判断文件的合法性这种方式比较常见,也很简单,是目前大多数APP选择的做法。public Object upload (@RequestParam("file") MultipartFile multipartFile) throws IllegalS
2020-07-15 21:51:28
727
原创 Nginx的跨域配置
使用SpringBoot开发前后端分离的应用,可以使用Nginx作为网关来统一解决跨域问题。这种好处是,可以不修改应用代码的情况下,让应用支持跨域。对于很多不支持的跨域的网站,你也可以弄个Nginx给它“加个Buff”,也就可以进行跨域访问了。 ????Nginx配置(这个配置,可以解决 95% 以上的跨域问题)server { listen 80; server_name localhost 127.0.0.1; location / { # 允许跨域请求的“域” ad
2020-07-13 17:16:50
283
原创 spring-data-jpa中的查询方法
查询方法,就是根据方法名来检索数据。按照一定的规则,通过方法名描述要检索的字段,过滤的条件,排序的策略等等,它们大都以find, get… 等开头。spring-data-jpa会自动解析,并且完成检索。省时省力。在 Repository 中定义查询方法public interface UserRepository extends Repository<User, Long> { // 根据emailAddress和lastname 检索所有的记录 List<User>
2020-07-13 12:43:55
244
原创 在SpringBoot中使用HikariCP连接池
在SpringBoot中使用HikariCP连接池HikariCP 是一款性能极佳的数据库连接池,体积很小,大约130Kb。SpringBoot2.0也已经采用HikariCP作为默认连接池配置.。HikariCP官方Githubhttps://github.com/brettwooldridge/HikariCP对比各类连接池的基准测试。和Druid比怎么样国内用 Druid的也不少,如果需要在Durid 和 HikariCP之间进行一个选择,可以先参考双方作者之间的一次沟通 。https
2020-07-09 16:30:02
1043
原创 在浏览器中使用js-spark-md5计算文件的MD5
在浏览器中使用js-spark-md5计算文件的MD5最近开发一个视频系统,用户需要把文件上传到服务器。服务器再上传到转码服务器,编码为m3u8格式。我觉得客户端可以直接上传到转码服务器。对转码服务器设置了跨域后,客户端可以直接上传视频文件,但是上传接口需要文件的MD5值,网上找了一个口碑极好的MD5库 js-spark-md5(据说性能是最牛逼的)https://github.com/satazor/js-spark-md5官方的Demodocument.getElementById('file'
2020-07-06 21:55:35
814
原创 SpringBoot在WebSocket长连接中获取到HttpSession
SpringBoot在WebSocket长连接中获取到HttpSessionWebsocket是通过http协议握手后升级成为长连接,在握手的时候,可以读取到客户端http请求的所有信息,自然也包括 HttpSession。自定义配置类,继承 Configurator ,覆写modifyHandshake方法ServerEndpointConfigImpl.Configurator,提供了一个modifyHandshake方法,可以在完成握手后,读取客户端的请求,以及修改对客户端的响应。Handsha
2020-07-03 14:30:12
1673
原创 使用零拷贝对文件高效的切片和合并
使用零拷贝对文件高效的切片和合并对文件的切片/合并在应用中是一个很常见的需求,使用 FileChannel的 transferTo / transferFrom 的零拷贝方法(需要操作系统支持),可以高效的完成。切片/** * 对文件按照指定大小进行分片,在文件所在目录生成分片后的文件块儿 * @param file * @param chunkSize * @throws IOException */public static void chunkFile(Path file, long
2020-07-01 12:08:10
384
原创 spring配置文件(xml)中最新,最常用的schema
spring配置文件(xml)中最新,最常用的schema可以收藏起来,在用到的时候直接复制粘贴进去,再把没用到的删除即可。Schema<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.
2020-06-28 15:06:33
181
原创 springBoot整合spring-data-jpa
SpringBoot整合spring-data-jpajpa 是JavaEE定义的一种规范,常用的实现一般是 Hibernate,而 spring-data-jpa 则是对jpa的又一层封装,提供了更多便捷的方法。这里不会深入讲解spring-data-jpa的使用,只是讲解怎么快速的整合使用,目的是帮助那些想学,但是在整合上老是翻车的同学导入依赖<dependency> <groupId>com.zaxxer</groupId> <artifactId
2020-06-23 18:05:51
247
原创 在SpringBoot中整合使用Netty框架
在SpringBoot中整合使用Netty框架Netty是一个非常优秀的Socket框架。如果需要在SpringBoot开发的app中,提供Socket服务,那么Netty是不错的选择。Netty与SpringBoot的整合,我想无非就是要整合几个地方让netty跟springboot生命周期保持一致,同生共死让netty能用上ioc中的Bean让netty能读取到全局的配置整合Netty,提供WebSocket服务这里演示一个案例,在SpringBoot中使用Netty提供一个Webso
2020-06-22 17:25:14
1411
原创 在SpringBoot应用中使用Minio作为云存储服务
在SpringBoot应用中使用Minio作为云存储服务除去阿里云之类的公有云,自己搭建一个私有云也是蛮不错的,虽然访问速率受到服务器带宽限制,但是它的存储和访问都是免费的。对于一般的APP来说,够够的。MinioMinio是什么Minio是Apache License v2.0下发布的对象存储服务器它与Amazon S3云存储服务兼容它最适合存储非结构化数据: 如照片, 视频, 日志文件, 备份和容器/VM映像对象的大小可以从几KB到最大5TBMinio服务器足够轻, 可以与应用程序堆栈
2020-06-19 12:12:00
1510
原创 在SpringBoot中使用RestTemplate发送复杂的multipart请求
在SpringBoot中使用RestTemplate发送复杂的multipart请求multipart/form-data 请求体本质上就是。一个请求体包含多个Part,每个Part有自己独立的header和body。一般用于文件上传,以及一次性提交多种不同数据格式的请求。这里演示提交一个文件的时,还提交一个json,一个表单数据到服务器,由SpringBoot处理请求。通过RestTemplate发送multipart/form-data请求import java.io.IOException
2020-06-17 22:12:25
4871
1
原创 在SpringBoot中通过RestTemplate提交文件到Github(白嫖图床)
在SpringBoot中通过RestTemplate提交文件到Github(白嫖图床)Github仓库 + jsDelivr = 全球加速的免费图床之前写过一篇帖子,GitHub + jsDelivr CDN 全球加速的免费图床,它不香吗? 这篇帖子中,使用的是桌面客户端 PicGo,进行图片上传的。在这里我们使用SpringBoot中的RestTemplate作为客户端,上传文件到Github仓库。先在Github中创建一个public的仓库,和AccessToken参考上面的帖子,这里不再重复讲
2020-06-16 21:44:07
524
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人