- 博客(48)
- 收藏
- 关注
原创 若依shiro非前后端分离项目集群化改造
若依前后端不分离基础项目,使用shiro框架作为授权和认证的安全框架。对比前后端分离项目的token验证机制,不分离项目仍然采用的是cookie + session的组合,浏览器存储的cookie与服务端的session进行校验。项目集群方案,前后端分离项目有着天然的优势,前后端不分离项目就要考虑session共享的问题了。因为session机制对于单机应用是没问题的,在集群环境下,当请求被分配到另一台服务器时,新的服务器无法通过浏览器传入的cookie值取到session,这样登录状态就会验证失败。
2024-09-21 09:06:34 1034
原创 线程调优——调整线程池参数提升程序执行效率
其实,线程的数量并不是越多越好,每个线程都需要系统分配一定的资源,如内存和CPU时间。每个线程都有其栈内存,线程数量过多可能导致内存不足,甚至可能影响系统的稳定性。线程的管理和使用需要根据具体的应用场景和需求来决定,通常,线程数量应与可用的CPU核心数相匹配,或者稍微多一些,以充分利用多核处理器的能力。如果线程数量超过了CPU核心数,线程间的上下文切换会变得频繁,可能会导致性能下降。一般情况下,根据业务的需求及服务器的配置,调整最优的线程池参数来进行线程调优,提升程序的执行效率。
2024-09-20 21:51:28 631
原创 一篇文章说清楚Filter(过滤器)、Interceptor(拦截器)和AOP(切面儿)
Filter、Interceptor、AOP都是用于实现应用横切关注点的技术手段,通过这些技术,可以将横切关注点的代码从核心业务逻辑中解耦,使得代码更加清晰和可维护,同时也提高了代码的复用性。但是三者的应用场景还是有些区别的,Filter主要用于处理HTTP请求和响应,在Servlet容器中工作,可以实现如日志记录、安全性过滤、跨域请求处理等;Interceptor主要用于在Spring MVC中拦截方法调用,允许在方法执行前后添加额外逻辑,用于实现权限拦截、日志记录、事务管理等;
2024-07-04 21:55:38 1492
原创 自定义注解(二)——系统日志记录
系统日志记录,区别于@Slf4j或@Log4j把日志文件写入到log文件中,而是直接写入到数据库表中。在AOP切面中可以跟踪入参情况、异常情况、返回值情况,并且把这些关键信息全部持久化到数据库中
2024-04-13 17:08:50 988
原创 自定义注解(一)——统一请求拦截
自定义注解可以帮助我们更好地组织和管理代码,提高代码的可读性和可维护性,还能实现高效的代码复用和解耦。通过自定义注解,可以将相关的处理逻辑集中管理。例如,可以创建一个用于校验参数的注解,集中处理所有的参数校验逻辑,避免在每个方法中重复编写校验代码。随着项目的发展,可能需要引入新的功能或对现有功能进行调整。自定义注解使得这些扩展更加容易实现,只需添加或修改注解处理逻辑,无需修改使用了注解的类或方法,这样有助于开发出更加清晰、结构化的代码。
2024-04-13 13:12:46 560
原创 又是一年春来到,快来围观用Java代码写春联
基于春联的实现,其实可以拓展一下思路,是不是就可以实现在背景图上使用代码渲染文字了,是不是比P图来的方便的多。让程序在实际生活中也有了更多的色彩,最后祝大家在新的一年“龙行龘龘 前程朤朤”!
2024-02-03 14:21:10 518
原创 用一千多行Java代码完整实现斗地主游戏
用一千多行Java代码实现的斗地主游戏,后端使用的技术栈是Springboot+SpringCache+Websocket,项目中运用了Java基础及面向对象的各类技术,类、接口、对象、枚举、集合、Map、数组、排序、算法、缓存等都有使用......前端使用的是Thymeleaf+原生的js/jquery。项目逻辑比较全面,满足斗地主游戏的基本需求,包括:玩家准备、抢地主、出牌、牌规则验证、出牌验证等,使用Websocket实时推送到前端交互,整体逻辑代码比较简洁明了,供大家学习参考
2024-01-28 21:21:29 1004
原创 常用登录加密之Shiro与Spring Security的使用对比
Shiro与Spring Security都是主流的身份认证和权限控制安全框架,Shiro偏向于前后端不分离平台,而Spring Security更偏向于前后端分离平台。接下来简单列一下两种登录验证的执行流程和示例,了解实际运用中的登录执行流程,然后重点剖析一下密码验证的过程。其实,密码验证的本质就是比较用户输入的凭证(密码)和存储的凭证(加密后的密码)是否匹配 ,如果一致,则表示密码验证通过。
2023-12-17 18:56:09 401
原创 Redis那些事儿(三)
接着上一篇Redis那些事儿(二),这一篇主要介绍Redis基于Geo数据结构实现的地理服务,它提供了一种方便的方式来存储和处理与地理位置相关的数据。Geo数据结构是Redis的一种特殊数据类型,用于存储地理位置信息,每个地理位置被表示为经度和纬度的坐标,可以将这些坐标与一个或多个成员关联起来。Redis的地理服务提供了一套简单而强大的功能,可以方便地存储和处理与地理位置相关的数据,它适用于许多应用场景,如地理定位、附近的人、附近的店铺搜索、附近的停车场、附近的地铁站…等等,大大提升了定位排序的效率。
2023-11-05 22:08:58 386
原创 Redis那些事儿(二)
接着上一篇Redis那些事儿(一),这一篇主要介绍Redis的发布和订阅功能,可以实现高效的消息通信和事件驱动架构。Redis的发布和订阅功能是一种消息传递模式,通过该功能可以实现消息的广播和订阅。Redis的发布和订阅功能是异步的,发布者和订阅者之间没有直接的通信。当发布者将消息发送到频道后,Redis会将消息传递给所有订阅了该频道的订阅者。订阅者会在接收到消息后立即进行处理,而不需要发布者等待。
2023-11-05 09:33:24 220
原创 Redis那些事儿(一)
说到redis大家都不陌生,其中包括:共有16个数据库,默认为第0个数据库;数据以key-value键值的形式存储;数据类型包括String、List、Hash、Set等,其中最常用的是字符串;是单线程的、基于内存的,主要受内存和网络带宽的影响… 这些都是基于Redis的基础理论知识储备。接下来我会通过开发中的StringRedisTemplate对象作为切入点,说一说Redis在开发中的那些事儿。
2023-11-04 17:47:03 335
原创 一篇文章带你彻底了解Java常用的设计模式
说到Java开发,设计模式肯定是绕不开的,Java常用的设计模式主要包括很多,一种说是有10种设计模式,还有一种说是23种设计模式。我这边重点解释了开发中常用到的8种设计模式,分别是:工厂模式、单例模式、原型模式、适配器模式、观察者模式、策略模式、装饰者模式、模板方法模式。其中每种模式都有其特定的应用场景和优缺点,在实际开发中,根据具体需求选择适合的设计模式可以提高代码的可维护性、可扩展性和重用性。需要根据具体情况来合理选择和组合使用设计模式,最终的目的就是让我们的代码优雅且可读性强,整体逻辑高内聚、低耦合
2023-08-26 20:48:14 343
原创 netty运行一段时间报错:java.io.IOException: 打开的文件过多
netty做了一个TCP/IP的通讯服务,运行一段时间,服务就崩了,报错内容如上:java.io.IOException: 打开的文件过多。网上的解决方案基本就都没用,只能靠自己分析报错原因了。最终解决方案需要在netty初始化的时候,设置连接超时时间......
2023-08-26 11:54:01 1723
原创 从零开始搭建一个vue项目(保姆级教程)
我这边在本地起了一个后台服务(建议后台服务做好跨域配置),模拟接口访问调用,一共测试了三种方式:①get无参请求 ②get有参请求 ③post请求json传参。新建api文件夹,放在api文件夹下,需要引入http文件,js文件地址:src/api/pageB.js。项目建好之后,就可以配置ui组件了,可以选择npm去装,也可以选择yarn安装,我把两个命令都列出来了。第二步,选择【Vue.js】,输入自己项目的名称,点击【Create】生成项目。在main.js中import之后,ui组件才正式生效。
2023-07-23 19:12:30 5379
原创 微服务Feign调用报错:Body parameter 0 was null at feign.Util.checkArgument
微服务使用feign进行跨服务调用时导致,报错原因分析就是少参数了。A服务通过feign调用B服务,B服务需要传一个参数,但是A服务调用时却报错参数是空的!代码如下,A服务实际是传参了,但是系统没有识别到参数。使用feign跨服务调用时,如果A服务调用B服务的Get请求传单个参数,A服务的FeignService传参时需要加入。
2023-07-08 17:34:58 1864
原创 Java解析环保HJ212协议
HJ212是由国家环保行业制定的数据传输标准协议,通常是通过TCP/IP通讯方式进行数据传输的,数据传输报文主要由包头、数据段长度、数据段、CRC校验、包尾组成。重点解析的就是”数据段“的内容,内容包括请求编码(QN)、系统编码(ST)、设备唯一标识(MN)、密码(PW)、命令编码(CN)、指令参数(CP)。请求编码为请求的时间戳,系统编码ST统一规定为22,命令编码CN为该数据包的时间类型,访问密码、设备唯一标识在对接时由平台提供,指令参数为数据内容。基本报文示例:ST=22;CN=2011;
2023-07-03 22:46:07 3939
原创 Java程序处理视频裁剪(快速处理大文件)
用java程序实现一个视频剪切工具,处理大的视频软件不失真、速度快,轻松搞定大文件视频剪切的需求,非常方便。解决遇到动辄大几G、十几G的文件裁剪困难的问题
2023-07-01 10:39:10 3933 2
原创 报错解决:Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource..
其他都没有数据库的元素,但是一启动的时候就报错,就只能从启动类那边下手了,最后定位到启动类注解@SpringBootApplication了,可能在启动的时候就默认加载数据库的配置,程序找不到,就报错了。只需要在注解上去除DataSourceAutoConfiguration就可以了,完美解决
2023-06-01 20:45:00 689
原创 Linux环境下配置jdk
首先,先要有一个预装好的Linux系统,我这边使用的是Centos7.*;其次,要有jdk的tar.gz包,可以通过线上下载(如果是离线的系统就不行了),也可以下载好,直接上传到服务器中,我使用的是下载好之后用WinSCP上传的方法
2023-05-30 19:15:00 515
原创 Java中Map与对象之间互相转换
Map在日常开发应用中的频率很高,最常用的实现类是HashMap和有序的TreeMap。在企业级应用中,更多的应用场景是关联JSON和Object使用,Map可以用于JSON传参、接收JSON参数,返回JSON数据等,也可以用于对象处理,开发者可以省一些简单实体类,用map来替代
2023-03-17 21:45:00 14078 1
原创 sentinel报错:field private java.util.Optional com.alibaba.cloud.sentinel.SentinelWebAutoConfiguration
使用2021.1版的spring-cloud-alibaba时,如果启用了sentinel作为流控、降级服务,启动的时候会报错误:The dependencies of some of the beans in the application context form a cycle:com.alibaba.cloud.sentinel.SentinelWebAutoConfiguration (field private java.util.Optional com.alibaba.cloud...
2023-03-09 22:30:00 1460 2
原创 Java进制间的互相转换(2进制、10进制、16进制)
根据业务开发需求及日常开发需求,整理了所有常用的进制间的转换方法,包括:2进制与10进制互转、10进制与16进制互转、2进制与16进制互转等
2022-12-31 18:25:26 818
原创 Java集合与数组互相转换
集合与数组互相转换在日常业务开发中必不可少,有时业务需要的是集合,而程序提供的是数组;或者业务需要的是数组,而程序提供的是集合,这就需要转换了
2022-12-31 18:23:58 9719
原创 java基于opencv图片灰度处理小工具
基于opencv对文件夹内的所有图片进行灰度处理,直接在小工具程序上选择待处理的文件夹,对文件夹内的所有图片进行灰度处理。此方法区别于调样式风格灰色处理,而是直接把图片更换为灰度处理后的图片
2022-12-18 16:09:16 972 2
原创 Java实现斗地主?原来如此简单(页面效果版)
用java程序做一个简单的斗地主游戏,设计思路比较简单,首先要准备一副扑克牌(一个集合,包含54个对象),然后打乱扑克顺序(洗牌),均匀发牌到三个玩家及最后的三张底牌,就实现了发牌的效果。
2022-11-27 11:38:46 2938
原创 多线程CompletableFuture之常用方法示例
多线程开发中CompletableFuture必不可少,对比传统的Thread、ThreadPool,CompletableFuture最大的优势是其非常强大的Future的扩展功能,可以在异步方法中获取返回值,类似前端的Promise
2022-11-06 15:04:33 1430
原创 Java高并发之Redis批量提交数据库
随着系统并发请求激增,参考电商秒杀、当下集中核酸采取等业务场景,如果突然大量数据请求业务系统。此时如果没有做任何缓存措施,直接保存数据库,即使你的数据库做了集群和分库分表,也会由于扛不住并发压力崩溃的
2022-11-06 15:02:09 2939 2
原创 报错JedisDataException: ERR wrong number of arguments for ‘rpop‘ command
redis.clients.jedis.exceptions.JedisDataException: ERR wrong number of arguments for 'rpop' command 报错说明
2022-11-04 19:27:25 4051
原创 SpringCloud Gateway的详细配置
SpringCloudGateway网关为微服务架构的系统提供简单、有效且统一的API路由管理,本文涉及到了网关的保姆级配置,包括:版本依赖、路由规则设置、网关跨域解决、网关过滤器实现、不拦截指定服务设置、不拦截指定地址设置等。
2022-09-27 21:53:18 3102 2
原创 Java中的反射,你在开发过程中使用了吗?
在程序运行状态中,任何一个类都能够知道这个类的属性和方法,类对应到对象,任何一个对象都能够调用它的方法和属性
2022-09-20 21:45:00 240
原创 基于RabbitMq的削峰实例
RabbitMq在我们日常开发中不可或缺,作为主流消息中间件,可以用于项目中的应用解耦、流量削峰、异步处理(非主流任务交由队列下发处理)等,本文着重介绍运用于项目中流量峰值时,依据服务器的消费能力进行削峰,最大限度保障服务器不宕机
2022-09-09 21:15:00 2154
原创 Java中double保留2位小数(精度丢失)的两种方式
对于double数据类型进行计算发生的精度丢失的情况,可以按照自己的需求选择任意方式,方式一更灵活点,方式二可以直接得到字符串类型的结果
2022-08-31 20:45:00 14800
原创 java从集合中快速取某个元素
对于元素的泛型为对象时,提供了五种方式从集合中取元素,每种方式都有各自的优缺点,都有各自的应用场景,可以依据自己的业务场景选择合适的方案
2022-07-09 16:32:21 10741 2
原创 springboot2.6+升级后的踩坑说明
踩坑一:springboot2.6+路径匹配多斜杠"/"报错项目升级之后,会发现之前的不规范路径会报错。例如:http://localhost:8080/hello访问是正常的,http://localhost:8080//hello访问就会报错,主要原因是springboot升级2.6+之后更加严谨了,url默认标准为严格匹配踩坑二:springboot2.6+中文资源名称无法访问还有一个坑,就是之前通过addResourceHandlers方法设置文件的访问路径映射,中文路径读取不到了。例如:通过
2022-05-19 10:47:59 1555
原创 Java模拟获取随机车牌号的两种方式
通过简单的几行代码,模拟用户选车牌的业务场景,这边只是简单的获取随机车牌,没有任何业务交互!这边提供了2种方式获取随机车牌,首先是定义好字母数组和车牌数组,方式一是每个字符都是随机获取字母或数字,方式二是把字母和数字都放在集合种,每次都打乱集合的顺序,获取集合的前5个元素。个人觉得方式一更好些!有兴趣的可以做一个延伸,例如:显示过的再一次执行的时候就直接过滤掉等以下是源码:public class CarNumberController { private static Random ran
2022-03-04 11:40:22 1856
原创 Java对文件的基本操作(查找、读取)
1.读取目录下的所有文件隐藏的文件一网打尽,快速定位要找的那个文件/** * 查询路径下的所有文件 * @param path 路径 */private static void find(String path){ File file = new File(path); File[] files = file.listFiles(); if(files!=null){ for (File f : files) { if (!f.is
2021-12-10 18:45:00 1660
原创 Java8中Stream流的用法示例大全
Stream流是Java8新添加的一种声明的方式处理数据方式,Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象。支持筛选、排序、聚合等。对于任何一项技术,每个人都有自己独到的见解,有些人习惯在理论上分析,有些人习惯在实践中提升,这都不影响我们灵活运用这项技术。我这边通过一个方法整理出日常开发中经常用到Stream的技术点,说实话,对于常规的数据处理,真的太方便了~首先,做个拓展,从一个txt中读数据,作为一名优秀的程序员,不能一直拘泥于在数据库中读
2021-12-08 18:48:00 1230
原创 Java开发中多线程的使用梳理(二)
多线程(二):线程池的使用一、为什么要使用线程池在java的日常开发中,如果频繁的创建线程,对系统的开销是非常大的,可能会使系统由于过度消耗内存或切换过度而导致系统资源不足。而线程池包含池管理器、工作线程、任务列队、任务接口等模块,可以减少线程的创建和销毁次数,解决线程生命周期开销问题和资源不足问题,从而提高服务器的工作效率。使用对比1.线程public void thread01(int taskCount){ for (int i = 0; i < taskCount; i++)
2021-12-03 15:04:10 598
原创 Java开发中多线程的使用梳理(一)
多线程(一):线程的创建及使用一、启动多线程的三种方法1.继承Thread类,重写run方法,启动->直接start()/** * 启用线程方式一 */public void thread01(){ new MyThread().start();}public class MyThread extends Thread { @Override public void run() { try { Thread.sleep(
2021-12-03 13:49:43 347
Java代码开发斗地主游戏全代码
2024-01-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人