- 博客(214)
- 资源 (2)
- 收藏
- 关注
原创 前后端分离情况下的跨域资源共享如何理解,Spring Security如何配置
CORS(Cross-Origin Resource Sharing) 是浏览器的一种安全机制,用来防止网站之间恶意请求用户的敏感数据。举个例子:这两个端口不同,属于不同源。当你从前端发起 AJAX 请求访问后端 API,就触发了“跨域”。
2025-06-16 15:46:37
238
2
原创 Spring Security实现基于资源/属性的权限控制
Override@Override@Override@Override@Override@Override@Override@Service@Autowired@Autowired@Overridethrow new UsernameNotFoundException("用户不存在");
2025-06-16 11:47:00
303
原创 Spring Security实现基于角色的权限控制
Spring Security 的权限控制是通过 SecurityContextHolder 中保存的认证信息(Authentication)进行的。权限信息来自 UserDetails 的 getAuthorities() 方法。只要保证返回的 Collection<?extends GrantedAuthority> 包含 ROLE_xxx,就可以进行角色控制。
2025-06-13 13:32:36
387
原创 Spring Security如何拿到登录用户的信息
Data直接让TUser实现UserDetails接口额外写一个LoginUser实现UserDetails,并包装TUser职责分离(Separation of Concerns)
2025-06-11 12:15:06
793
原创 Spring Security的使用,如何实现一个简单的登录功能
spring security里面的UsernamePasswordAuthenticationFilter接收账号和密码,并调用loadUserByUsername(String username)方法,根据用户名去查数据库中对应的用户。在数据库里查到之后,会将这一用户报装为UserDetail对象,返回给Spring Security框架。Spring Security框架接收到这个UserDetails后,会继续在filter里判断用户状态、密码等,都ok了才能登录否则失败。
2025-06-10 11:40:30
317
原创 SpringBoot3项目中MyBatis-Plus启动报错:factoryBeanObjectType类型错误的解决方案
而老版本的 mybatis-plus(2.x)会在 MapperScannerConfigurer 中将这个属性设置为 String 类型,Spring Boot 3 无法接受,因而抛出异常。因而解决方式也很简单了,那就是调整一下让他们版本适配就行,升级 MyBatis-Spring 至支持 Spring Boot 3 的版本,推荐使用官方提供的适配 Starter。导致整个 Spring 容器启动失败,ApplicationContext 初始化终止。
2025-06-10 10:02:23
221
原创 mybatisX的使用,简化springboot的开发,不用再写entity、mapper以及service了!
假设你用的是idea社区版可以用free mybatis tool,貌似可以平替mybatisX,用的时候直接右键你想操作的表。
2025-06-09 15:40:23
304
原创 使用nginx配置反向代理,负载均衡
具体咋改呢,那就新增一个新的server配置,然后在location里新增你想代理的服务器。咋配置呢,那当然是在nginx目录下改conf文件了。
2025-06-03 11:51:42
503
原创 sharding jdbc的使用,如何在Spring中实现数据库的主从分离、分库分表等功能
使用Sharding-JDBC就可以了,它是一个 轻量级的 Java JDBC 层中间件,用于实现分库分表、读写分离、分布式事务等功能,而且对于我们经常使用的mybatis之类的是兼容的。不过当数据量和读写流量较小的时候,请谨慎评估是否需要分库分表和读写分离,然后再决定具体要采用下面这个application.yml里的哪些策略。以下用一个两主两从数据库作样例,因为这样既能分库分表,又能读写分离。
2025-05-27 22:30:27
337
原创 如何用Spring Cache实现对Redis的抽象
这是一种给你手动操作Redis数据的方式,你可以调用.opsForXXX()来获取数据,是一种更加灵活、精细操作Redis的方式,例如在实现分布式锁等场景可以采用。但我们本文介绍的CacheManager是通过注释的方式自动操作缓存的,是一种方法级的自动缓存,简洁优雅,推荐用于 Controller/Service 层。我们在进行Java项目开发时候,经常会用到Redis缓存例如数据库里的一些信息、手机验证码之类的,正常写法就会像去连mysql一样,这种硬编码的方式肯定是非常不合适的。
2025-05-27 10:25:23
588
原创 redis在Spring中的一些使用
好,让我们解释一下这是为啥,因为RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化。(字节形式可读性差,且占用内存较大)
2025-05-26 17:59:55
302
原创 Spring开发系统时如何实现上传和下载文件
简化参数绑定:通过 @RequestParam(“file”) MultipartFile file 即可直接获取文件对象,无需手动从 HttpServletRequest 中提取数据。框架自动解析:当请求的 Content-Type 为 multipart/form-data 时,Spring 会自动解析请求体,并将文件内容封装为 MultipartFile 对象。值得注意的是上传时候不需要参数servletRequest而下载时候却需要servletResponse,这是为什么呢?
2025-05-22 22:46:11
366
原创 mybatisplus公共字段自动填充
你比如说像插入时间、更新时间等这种类型的字段,你在插入、更新时候要额外写一个setValue,总写总写其实有点麻烦的,这里mybatisplus给我们提供了一个公共字段统一自动填充的方式。只需要在对应字段加上注释@TableField(fill = FieldFill.INSERT_UPDATE),FieldFill.INSERT_UPDATE代表插入和更新时候都自动填充。然后再写一个自动填充逻辑,
2025-05-22 16:24:09
175
原创 前后端的双精度浮点数精度不一致问题解决方案,自定义Spring的消息转换器处理JSON转换
原因在于 JavaScript 使用的是 双精度浮点数(Number 类型) 来表示数字,而双精度浮点数只能精确表示 最大 53 位的整数,超过 53 位的整数会丢失精度。在 Java 中,Long 是一个 64 位的长整型,通常用于表示很大的整数。在后端,Long 类型的数据没有问题,因为 Java 本身使用的是 64 位的整数,可以表示的范围非常大。可以看到,前端打印出来的数字已经失去了精度,因为超出了 JavaScript Number 类型能精确表示的范围。
2025-05-21 16:06:30
364
原创 javaweb的拦截功能,自动跳转登录页面
实现Filter接口里的doFilter方法,并在这个filter里完成对应逻辑@Slf4j// 路径匹配器,这个是springboot给我们提供用于路径匹配的工具@Override// 这里强转类型没啥问题,因为是http请求,所以其实就是HttpServletRequest和HttpServletResponselog.info("请求路径为:{}", servletRequest.getRequestURI());
2025-05-21 10:52:32
397
原创 mybatis plus中的BaseMapper、IService、ServiceImpl之间关系解释
比较容易知道的是BaseMapper< T >这玩意主要是集成了一些基本的CRUD的方法,和普通的Mapper一样,他是对应Mapper层交互数据库的。(下面是借的别人的图)你实际上开发项目时候,肯定有自己的数据库表,并且对应了一个实体类xxx,那就得定义一个xxxMapper去继承BaseMapper,那这样你就已经有访问数据库的能力了(靠BaseMapper给你提供好的)。
2025-05-20 10:55:25
292
原创 mybatis plus的一些简单知识点
首先这是个操作数据库的包,把它引入到maven的话,自动包含了mybatis,你还是可以写sql然后用,不过仅限于一些复杂sql语句场景了,对于一些普通的单表操作,就直接用mybatis plus一些函数式就直接完成了,不用写sql了。像这种要更新某个具体的值,就是统一赋值的也可以用queryWrapper,但是这好像要查两次数据库,不如直接一次查。但是以上两种在代码里都属于是魔法值了,硬编码,太丑了,可以采用下面这个方式,用反射的方式拿到字段。关于一些配置,比如绑定实体类到指定的数据库表。
2025-02-28 10:14:57
151
原创 Maven中一些基础知识点
首先我们要引入新的依赖自然是在dependencies下写dependency,这个dependency具体咋写可以去maven的中央仓库查对应的库,然后粘过来。Lombok、jdbc等等都是这样来的。早些时候只知道创建或者开发springboot项目时候,有一个叫pom.xml的文件可以用来管理项目所需的依赖/第三方工具。然后还有搭建私服,可以把自己团队开发的包传上去,因为你不可能传到中央仓库,那属于泄密了,这个暂时没去了解,之后有需要再说。这样的话,父工程管理的包,子工程可以直接继承过来了。
2025-02-25 20:19:52
577
2
原创 Java 中HashMap 的几种遍历方式以及遍历速度
Stream 更适合大规模并行处理场景,而在小规模数据或常规使用场景下,entrySet()方式依然是最快的选择。
2024-10-14 21:17:51
464
1
转载 IO多路复用
用户态拿到这个有事件的文件描述符返回,还要针对返回的描述符进行遍历,才能知道哪个文件描述符对应的socket可写可读,总共经历了两次遍历,两次拷贝,所以说为什么select在文件描述符比较多的情况,效率为什么是低下的原因。通过调用epoll_create,在epoll文件系统建立了个file节点,并开辟epoll自己的内核高速cache区,建立红黑树,分配好想要的size的内存对象,建立一个list链表,用于存储准备就绪的事件。内核将就绪的文件描述符放在传入的数组中,所以只用遍历依次处理即可。
2024-10-06 22:25:09
312
原创 Java 中的 sleep、wait、join 怎么理解
在 Java 中,sleep()、wait() 和 join() 都是与线程同步和控制相关的常用方法,它们各自有不同的功能和使用场景。
2024-09-18 16:02:57
633
原创 java序列化
Java 会根据类的名称、成员变量、方法等信息自动生成一个 serialVersionUID。但是,如果你在不显式定义的情况下对类做了修改,例如添加或删除字段、方法等,编译器可能会生成不同的 serialVersionUID,从而导致反序列化失败。因此,显式声明 serialVersionUID 是一种好的实践。
2024-09-18 15:47:20
1100
原创 leetcode 33. 搜索旋转排序数组
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2]。输入:nums = [4,5,6,7,0,1,2], target = 0。输入:nums = [4,5,6,7,0,1,2], target = 3。
2024-09-10 15:06:00
348
原创 leetcode 31. 下一个排列
例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。那肯定是和尾部比它大的换,比和它小的换不会让数字变大,所以从尾部开始找第一个比它大的(位置j),两者交换。类似地,arr = [2,3,1] 的下一个排列是 [3,1,2]。例如,arr = [1,2,3] 的下一个排列是 [1,3,2]。
2024-09-05 15:51:50
469
原创 回调是什么以及同步异步回调怎么实现
在 Java 中,回调(Callback)和异步回调(Asynchronous Callback)都可以通过接口、匿名类或 lambda 表达式来实现。下面我将分别展示如何在 Java 中实现回调和异步回调。
2024-09-04 22:57:56
391
原创 threadlocal的一些用法,以及如何解决可重入分布式redis锁
好的,经过我的思考,threadlocal是一个还不错的选择,因为是对线程内共享的,事实上threadlocal应该是为了解决一些在线程内传递状态所使用的手段,(要不然你还得疯狂传参,中间要是遇到封装的第三方库,你还改不了),好,这个状态其实说起来应该是叫上下文context比较合适,除了状态外,它也可以是用户身份,任务信息等。这里的话对于可重入分布式锁,就可以有一个Integer类型的threadlocal变量,重入就+1,释放就-1,直到0了,才真正释放锁就可以了。
2024-08-26 17:07:51
687
原创 leetcode 875. 爱吃香蕉的珂珂
珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。说实话,这题我不会,但看了题解后,看懂了一些,尝试写一下题解,这是道经典二分的题,要找的结果是最终的k,那么区间左端点代表速度最小值,右端点代表速度最大值,要找中间合适的 k。通常来讲的二分就是 找到 k==k,这里的判定条件是速度 k 能刚好吃完所有堆的香蕉,不过这种类型的二分需要找好分割边界条件的点和初始的左右端点。输入:piles = [30,11,23,4,20], h = 5。输入:piles = [30,11,23,4,20], h = 6。
2024-08-25 22:59:44
348
原创 使用一致性哈希解决哈希分片负载均衡的扩展性问题
解决方案也有,那就是一致性哈希,一致哈希算法是对 2^32 进行取模运算,是一个固定的值。可以想象有一个圈,存储节点做哈希,比如根据节点的 IP 地址进行哈希。通常来讲可以范围分片或者哈希分片,将数据拆分到不同的存储节点上去。假定选择ID,那有可能热点数据集中到同一张表里了,没起到分摊访问数据库流量的作用。有亿级数据,如何拆分,使得访问请求不会造成数据库崩掉?还可以为硬件配置更好的节点增加权重,比如对权重更高的节点增加更多的虚拟机节点。这都可以,甚至不同机器的配置不同,可以根据配置分配权重,然后分发流量。
2024-08-20 17:17:59
686
1
原创 倒排索引是什么?有什么用?
mysql的全文索引的实现方式其实就是倒排索引,倒排索引是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射,常被应用于搜索引擎和关键字查询的问题中。这种倒排索引对于检索系统的关键词检索或者大数据处理的word count功能等,都是非常关键的功能。我们知道索引通常是用来查询某个key是否存在,或者避免一些外部排序操作的。但倒排索引是个啥呢?
2024-08-18 17:51:44
340
原创 leetcode 124. 二叉树中的最大路径和
然后决定当前这个节点为根节点的树能达成的最大路径和是多少,然后再把这个节点作为最长路径的一部分的结果返上去,有点dp 那味。二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42。解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6。输入:root = [-10,9,20,null,null,15,7]输入:root = [1,2,3]路径和 是路径中各节点值的总和。
2024-08-12 23:10:27
265
原创 海量数据排序,外部排序的方式
所以这时候就需要采取外部排序,把数据分成若干块,分别排好序,从每个块里挑选最小的,进入堆。此时堆中最小的就是全局最小的,堆顶元素i出堆后,从堆顶元素i所在块里再拿出最小的,重复此过程,直到结束。来解决海量数据排序问题,但这个问题的前提是这些待排序数字不能太稀疏,因为其思想就在于将每个四字节数字转化为一个bit,假设稀疏,那连着很多bit都没有数字就白搞了。除了上述情况外,就算不稀疏,也有可能通过这种奇技淫巧也无法压缩下去。
2024-08-08 12:28:20
215
原创 海量数据去重、排序,bitmap的巧用
那我们来想一想除了hashmap还有什么可以O(1)来判断元素的状态。去重可以用bitmap,排序也是,当都存进bitmap后,可以从头遍历,因为已经是有序了。假设内存足够,那就放进hashmap就好了,O(1),很快就能查得到。假设给你40亿个qq号,问你某个qq号是否存在怎么办。
2024-08-08 11:48:09
194
myGoBang(java文件).zip
2020-06-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人