
笔记
文章平均质量分 87
姠惢荇者
衣带渐宽终不悔 为伊消得人憔悴
展开
-
在SpringSecurity + SpringSession项目中如何实现当前在线用户的查询、剔除登录用户等操作
在前一篇《在SpringBoot项目中整合SpringSession,基于Redis实现对Session的管理和事件监听》原创 2023-09-15 10:52:04 · 1634 阅读 · 0 评论 -
在SpringBoot项目中整合SpringSession,基于Redis实现对Session的管理和事件监听
SpringSession是基于Spring框架的Session管理解决方案。它基于标准的Servlet容器API,提供了Session的分布式管理解决方案,支持把Session存储在多种场景下,比如内存、MongoDB、Redis等,并且能够快速集成到Spring应用程序中。使用SpringSession实现Session管理,可以有效解决Session共享的问题,提升系统的可伸缩性和可靠性。原创 2023-09-15 10:12:22 · 3835 阅读 · 0 评论 -
使用CryptoJS实现Vue前端加密,Java后台解密的步骤和方法
CryptoJS 是一个 JavaScript 库,提供了一系列密码学函数和工具,用于加密、解密、生成摘要等任务。它支持多种加密算法,包括常见的对称加密算法(如 AES、DES)和非对称加密算法(如 RSA)。同时,CryptoJS还包括了ECB和CBC两种模式,其中ECB模式:全称Electronic Codebook(电码本),在ECB模式中,每个明文分组都被单独加密,且每个明文分组都被加密为相同的密文分组。也就是说,如果两个明文分组相同,那么它们的密文分组也相同。CBC模式。原创 2023-09-11 14:40:02 · 7035 阅读 · 0 评论 -
Vue学习笔记 之 Svg图标组件的实现步骤
svg-icon组件包括了svg文件(svg图片)、index.vue和index.js三部分内容。其中,svg文件,主要包括了各个图标对应的svg文件,上述vue.config.js文件中的配置,就是将该文件下的文件生成雪碧图;index.vue用来定义图标的vue组件;index.js实现了svg-icon组件的注册。具体实现如下:index.vue页面,代码如下:return {important;return {原创 2023-07-14 11:46:00 · 863 阅读 · 0 评论 -
Vue学习笔记 之 History 路由 和 Hash 路由的区别 及 History 模式时,Nginx的配置方式
History 模式时,服务器需要进行相应的配置,以确保在刷新页面或直接访问某个子路由时,仍能正确返回前端路由对应的页面。这是因为在 History 模式下,前端的路由和后端的路由是分离的,后端需要将所有路由请求都重定向到前端的入口页面。在 Vue Router 中,Hash 模式是一种简单且常见的路由模式,它使用 URL 中的哈希(#)来管理路由。然后,修改路由配置文件./router/index.js,在该文件我们配置了History 模式,同时还需要配置base路径,保证路由访问时的正确。原创 2023-07-06 11:56:52 · 4642 阅读 · 0 评论 -
微信小程序实现订阅消息推送的实现步骤
而Post方法, 当用户在微信小程序中主动订阅一次性消息时,腾讯服务器将请求Post的接口,发送用户的相关行为事件结果到开发者服务器,只有用户订阅的用户才允许进行消息推送,其实这里接收的不只是消息订阅事件,各类的交互事件都在这里进行接收的。在实际应用中,我们应该维护一张需要推送消息的微信用户数据表,包括该用户是否已订阅,微信用户的openid等信息,这里暂时演示,省略了该信息,直接固定硬编码了模板ID、消息内容、微信用户openId等信息。完成上述工作后,启动服务,先通过微信小程序进行消息订阅,原创 2023-06-14 12:47:17 · 37425 阅读 · 14 评论 -
第一次使用ThreadPoolTaskExecutor实现线程池的经历,反复修改了多次代码才正常使用
在一个向第三方平台推送消息的场景中,为了提高程序的执行效率,每次发送消息,都创建一个新的线程来完成发送消息的任务,为了提供线程的使用性能,我选择了ThreadPoolTaskExecutor线程池,结果在使用的过程中,出现了较多的问题,这里记录一下避免以后再出现类似的错误(这些错误是不应该出现的,还是对ThreadPoolTaskExecutor使用不熟悉造成的)。原创 2023-06-13 15:40:51 · 3731 阅读 · 0 评论 -
uniapp学习笔记——基于<uni-file-picker>组件和uni.uploadFile()方法实现图片上传
在编辑页面,有图片字段需要选择手机图片进行上传、预览、回显、删除等,尤其是当提交表单后,再次选择编辑该表单页面时,如何正确的显示图片,并保证再次提交时,可以没有异常。这里主要记录了一种在编辑表单时(图片字段返回的是图片地址)的一种处理方式,不一定是最佳实践,但是可以实现功能的正常使用。 组件和uni.uploadFile()方法在官方文档已经有非常详细的介绍了,这里只是简单说明一下,需要了解详细信息的请移步官方文档进行查看。 文件选择上传组件,可以选择图片、视频等任原创 2023-06-11 22:41:54 · 17388 阅读 · 0 评论 -
MinIO快速入门——在Linux系统上安装和启动
MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统。客户端支持Java,Net,Python,Javacript, Golang语言。MinIO系统,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。原创 2023-06-09 19:50:32 · 13937 阅读 · 2 评论 -
基于Canal实现Mysql数据实时同步到Elasticsearch(Docker版)
Canal主要用途是对MySQL数据库增量日志进行解析,提供增量数据的订阅和消费,简单说就是可以对MySQL的增量数据进行实时同步,支持同步到MySQL、Elasticsearch、HBase等数据存储中去。Canal会模拟MySQL主库和从库的交互协议,从而伪装成MySQL的从库,然后向MySQL主库发送dump协议,MySQL主库收到dump请求会向canal推送binlog,canal通过解析binlog将数据同步到其他存储中去。《传送门》。原创 2023-05-15 15:07:40 · 1053 阅读 · 1 评论 -
navicat连接PostgreSQL报:column “rolcatupdate” does not exist ...错误的解决办法
将Navicat 改成12+以上版本即可。具体原因:PostgreSQL 9.5以前的版本,pg_authid有个字段rolcatupdate,用来标记用户是否有更新catalog的权限。如果rolcatupdate=false,即使是超级用户也不能更新catalog。原创 2023-05-05 17:22:16 · 1457 阅读 · 0 评论 -
基于Mybatis使用MySql存储过程,实现数据统计功能
作为一个工作了很多年的程序员来说,没有在实际工作中真正使用过存储过程,其实对存储过程本身有过了解和学习,在日常的学习中,也会看过一些存储过程的相关介绍,不过“纸上得来终是浅”,正好这次做统计分析的业务功能时,适合使用存储过程的机会,就搞起来了,顺便记录一些遇见的一些问题,方便后续查看和学习。原创 2023-04-26 17:20:02 · 816 阅读 · 0 评论 -
SpringBoot中@ConfigurationProperties注解的常见使用(学习笔记)
@ConfigurationProperties是springboot提供读取配置文件的一个注解。其对应的bean的后置处理器为ConfigurationPropertiesBindingPostProcessor类,它是实现了BeanPostProcessor接口,在bean被实例化后,会调用后置处理,递归的查找属性,通过反射注入值,对大多数属性而言强制需提供其setter和getter方法。 @ConfigurationProperties注解加载配置文件三种常见的用法,如下: 这里需要注意的原创 2022-12-07 08:46:54 · 3695 阅读 · 1 评论 -
vue集成cesium入门教程(1)环境搭建、初始化三维地球
这篇内容是《vue集成cesium入门教程》的第一篇,我将记录在vue中集成cesium并实现页面的初始化(显示三维地图页面)等学习内容。原创 2022-09-29 17:01:44 · 2506 阅读 · 0 评论 -
JSqlParser入门教程之常用示例
JSqlParser是一个SQL语句解析器,它可以把SQL转换为Java对象进行操作的工具包,支持Oracle,SqlServer,MySQL,PostgreSQL等常用数据库。原创 2022-09-20 21:00:00 · 3991 阅读 · 1 评论 -
并发编程学习笔记 之 常用并发容器的概念及使用方法
所有线程对该容器的读取操作将不会对数据集合产生加锁的动作,从而使得高并发高吞吐量的读取操作变得高效,但是当有线程对该容器中的数据集合进行删除或增加等写操作时才会对整个数据集合进行加锁操作,然后将容器中的数据集合复制一份,并且基于最新的复制进行删除或增加等写操作,当写操作执行结束以后,将最新复制的数据集合引用指向原有的数据集合,进而达到读写分离最终一致性的目的。并发容器是指在高并发应用程序的使用过程中,这些容器(数据结构)是线程安全的,而且在高并发的程序中运行它们会有高效的性能表现。...原创 2022-07-29 17:44:12 · 553 阅读 · 0 评论 -
Spring配置加载顺序
Spring配置加载顺序对于一个标准的Spring Boot应用,可以通过多种方式进行配置。比如前面一直使用的配置文件(properties或yml)、命令行参数,此外还有系统环境变量、JVM的参数等。下面我们来了解一下这些配置方式。命令行参数:命令行参数使用–xxx=xxx格式在启动时传递,比如:–server.port=2300,就是将服务的端口设置为2300。这里的参考可以是Spring Boot框架的参数,也可以是我们自定义的参数或属性配置。从java:comp/env加载的JNDI属性。·原创 2022-07-26 20:36:41 · 1535 阅读 · 0 评论 -
Ribbon学习笔记二
维护服务实例清单服务实例清单的维护主要在抽象类BaseLoadBalancer中实现。在BaseLoadBalancer类中主要实现了:1、维护了“up”状态的服务列表和全部的服务实例列表2、通过IPing实现了设置服务实例列表的状态服务实例清单@Monitor(name = PREFIX + "AllServerList", type = DataSourceType.INFORMATIONAL)protected volatile List<Server> allServerLi原创 2022-07-26 20:35:42 · 360 阅读 · 0 评论 -
Ribbon学习笔记一
使用Ribbon,主要就是RestTemplate的使用。IClientConfig是Ribbon客户端的配置,我们可以通过它配置Ribbon相关的内容。IRule是负载均衡策略接口,也就是说,具体的负载均衡是通过它来提供算法的。IPing接口能判断服务实例是否可用。服务实例存在上线、下线和故障等多种可能,通过IPing接口能判定服务实例是否可用。ServerList是从Eureka服务端拉取服务实例清单,其中包含注册过的服务实例(包括可用的和不可用的)。ServerListFilter是服务实例过滤.原创 2022-07-26 20:35:21 · 311 阅读 · 0 评论 -
在uni-app项目中,如何实现微信小程序openid的获取
因为uni的login()方法封装了微信wx.login()方法,所以我们这里直接调用的是uni.login()方法,返回code后,再通过getOpenId()方法调用后台接口即可。在开发微信小程序的时候,我们需要当前的微信小程序用户和我们的后台用户建立关联,这个时候,我们就需要通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。我们可以获取微信小程序用户的openid作为唯一标识,和后台用户进行绑定,获取方式也比较简单,这里做一下记录,方便后续可以快速查找并使用。..原创 2022-07-26 16:46:48 · 11538 阅读 · 0 评论 -
并发编程学习笔记 之 ReentrantLock实现原理的探究
在前面我们已经了解到Lock接口,是对锁操作方法的一个基本定义,它提供了synchronized关键字所具备的全部功能方法,而ReentrantLock类不仅完全实现了显示锁Lock接口所定义的接口,也扩展了对使用显式锁Lock的一些监控方法。同时,我们也尝试使用ReentrantLock实现了对共享资源的同步访问,这一节我们来深入了解,这些功能是如何实现的。https。...原创 2022-07-22 22:21:30 · 278 阅读 · 0 评论 -
并发编程学习笔记 之 Lock锁及其实现类ReentrantLock、ReentrantReadWriteLock和StampedLock的基本用法
我们这篇内容主要学习了Lock锁及其实现类ReentrantLock、ReentrantReadWriteLock和StampedLock的基本用法,关于实现原理和读写锁的饥饿写问题产生的原因等,我们在后续内容中逐渐进行整理。httpshttps。原创 2022-07-21 13:23:08 · 430 阅读 · 0 评论 -
并发编程学习笔记 之 工具类Semaphore(信号量)
Semaphore(信号量)是一个线程同步工具,主要用于在一个时刻允许多个线程对共享资源进行并行操作的场景。通常情况下,使用Semaphore的过程实际上是多个线程获取访问共享资源许可证的过程。 Semaphore内部逻辑: 这里模拟最大人数的场景,当人数达到上限收,后续的线程就无法进入,当有信号量被释放后,后续的线程可以继续进入。 在上述示例中,线程“Thread-7”等到有是否资源后,又可以获取进入资格了。 release方法: 在Semaphore设计中,并未强制要求执行releas原创 2022-07-12 21:00:00 · 330 阅读 · 0 评论 -
并发编程学习笔记 之 工具类CountDownLatch、CyclicBarrier详解
CountDownLatch类允许一个或者多个线程去等待其他线程完成操作。CountDownLatch构建时接收一个int型参数,表示要等待的工作线程的个数,每个子任务执行完成后使用countDown方法进行减1操作,等待线程使用await方法进行等待操作,直到所有子任务完成,等待线程就会被唤起执行。 创建子线程,模拟执行任务,当子任务执行完成后,主线程被唤醒继续执行,具体实现如下:CountDownLatch常用方法1、Sync 内部类 CountDownLatch通过内部类Sync来实现原创 2022-07-12 22:00:00 · 600 阅读 · 0 评论 -
并发编程学习笔记 之 原子操作类AtomicReference、AtomicStampedReference详解
在《并发编程学习笔记 之 原子操作类AtomicInteger详解》中,我们学习了原子操作类AtomicInteger的用法,类似的还有AtomicLong、AtomicBoolean等类型,这些都是针对基本类型定义的原子性操作,那么针对对象是否有原子性操作呢?这一节,我们就开始学习原子操作类AtomicReference,看看如何实现针对对象的原子性操作。 这里我们改写了《Java高并发编程详解:深入理解并发核心库》一书中的例子,设计一个个人银行账号资金变化的场景: 首先,我们设计一个个人银行账号原创 2022-07-12 00:05:58 · 783 阅读 · 0 评论 -
并发编程学习笔记 之 原子操作类AtomicInteger详解
原子类型就是一种无锁的、线程安全的类型,解决了在多线程场景下使用基本数据类型和引用类型的线程不安全的问题。具体示例如下: 在上述代码中,运行了10个线程,每个线程均对count变量进行了1000的计数器自增操作,理想情况下,运行结束后,这个时候count的值应该是10000,但是实际情况,每次结果都可能不相同,有可能是10000,也有可能是小于10000的其他值。为什么出现这种情况呢?其实就是多个线程对count共享变量进行并行操作,导致部分线程的计算结果对其他线程不可见,造成了数据丢失。那么在共享原创 2022-07-07 17:42:58 · 2121 阅读 · 0 评论 -
Java并发——CAS Unsafe Atomic
Java无法直接访问底层操作系统,而是通过本地(native)方法来访问。不过尽管如此,JVM还是开了一个后门,JDK中有一个类Unsafe,它提供了硬件级别的原子操作。 这个类尽管里面的方法都是public的,但是并没有办法使用它们,JDK API文档也没有提供任何关于这个类的方法的解释。总而言之,对于Unsafe类的使用都是受限制的,只有授信的代码才能获得该类的实例,当然JDK库里面的类是可以随意使用的。 Unsafe类是在sun.misc包下,不属于Java标准。但是很多Java的基础类库,包转载 2022-07-07 16:51:52 · 178 阅读 · 0 评论 -
Java8的Stream调试神器——StreamTrace调试工具
在项目中往往充斥着各种各样的集合遍历操作,“看起来难受,写起来手酸”。自从 Java 8 开始,利用新增的Stream抽象,完美解决了以上问题。利用Stream进行数据处理,极大程度上简化了代码,提升了开发效率,但是Stream编程也给程序员的调试带来了极大的不方便,很多程序员可能都经历过调试Stream的痛苦。现在Idea 推出的StreamTrace功能,可以详细看到每一步操作的关系、结果,非常方便进行调试,为程序员带来了“福音”。 先熟悉一下,下面的代码,实现逻辑:第一步:筛选“cloth”类型原创 2022-07-07 13:47:56 · 885 阅读 · 0 评论 -
Java8 Streams用法总结大全 之 Collector用法详解
在《Java8 Streams用法总结大全 之 Stream中的常见操作》中,我们已经学习了Stream中的常用操作,其中也提到了collect()的用法,当时只是通过入参Collectors.toList()实现了把Stream转为List集合的功能,其实collect()还有很多其他的用法,入参就是实现了Collector接口的对象,同时Collectors可以看作是Collector的工厂类,其为我们提供了非常多的内建Collector的方法,具体如何使用,我们一起来学习一下。 在前面提到的co原创 2022-06-26 16:31:49 · 3410 阅读 · 0 评论 -
Java8 Streams用法总结大全 之 Stream中的常见操作
Java 8中的Stream是支持顺序或者并行操作的元素序列,它不是一个容器。它并不是用来存储数据的,而是对JDK中Collections的一个增强,它专注于对集合对象既便利又高效的聚合操作。它不仅支持串行的操作功能,而且还借助于JDK 1.7中的Fork-Join机制支持并行模式,开发者无须编写任何一行并行相关的代码,就能高效方便地写出高并发的程序。 在JDK 1.8版本中,Stream为容器的使用提供了新的方式,它允许我们通过陈述式的编码风格对容器中的数据进行分组、过滤、计算、排序、聚合、循环等操原创 2022-06-25 13:10:34 · 1828 阅读 · 0 评论 -
关于SpringBoot默认日志Logback的一些事儿
声明:本博客内容,均根据网络上的博客内容汇总而成,其中大部分内容以及在项目中进行验证和测试。主要参考文章,在文末以及注明。1、常用的日志框架 在日常的Java开发中,常见的日志框架有如下这些:Log4j最早的日志组件是Apache 提供的Log4j。Log4j 能够通过配置文件轻松的实现日志系统的管理和多样化配置,是我们接触比较早的日志组件,几乎成了java 日志的标准,如它定义的Looger、Appender、Level等概念一直沿用至今。JUL(Java Util Logging).原创 2022-05-04 18:33:34 · 2305 阅读 · 0 评论 -
SpringSecurity OAuth2中关于TokenStore实现类JwtTokenStore的详解
1、前言 在《SpringSecurity OAuth2中真正创建Token的实现类DefaultTokenServices、TokenStore(Token存储管理)的详解》中,我们分析了在OAuth2中,Token是如何创建的,同时也了解了TokenStore是如何管理Token的,并详细分析了InMemoryTokenStore 实现类的逻辑,而JdbcTokenStore 和 RedisTokenStore 实现思路是类似的,但是JwtTokenStore 的实现类就和InMemoryToken原创 2022-01-17 13:36:47 · 7028 阅读 · 2 评论 -
SpringSecurity OAuth2中关于创建Token的实现类DefaultTokenServices及TokenStore实现类的详解
5、AuthorizationServerTokenServices 生成Token AuthorizationServerTokenServices接口提供了创建Token、刷新Token、获取Token的方法,如下所示:public interface AuthorizationServerTokenServices { OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) throws Authent原创 2022-01-17 13:36:10 · 5698 阅读 · 1 评论 -
SpringBoot异常处理 之 404异常为什么不会被全局异常处理器处理呢(默认情况下)?
一、前言 在前面使用《自定义HandlerExceptionResolver类处理异常》和 《@ControllerAdvice+@ExceptionHandler注解实现异常处理》两篇内容中,我们如果没有经过特殊配置,会发现404异常,不会被被全局异常处理器进行处理,为什么呢?404异常和其他异常又有什么区别呢?带着这个疑问,我们开始今天的学习。二、如何让404异常在全局异常处理器中生效? 其实,让404异常可以被全局异常处理器捕获非常容易,只需要在application.properties配原创 2021-08-26 15:44:25 · 1985 阅读 · 1 评论 -
SpringBoot异常处理 之 自定义HandlerExceptionResolver类处理异常
一、前言 前面在《基于@ControllerAdvice注解实现全局异常处理用法和原理的探究》中,我们学习了使用@ControllerAdvice+@ExceptionHandler注解实现全局异常处理的方式,今天我们来学习另外一种全局异常处理的方式——自定义HandlerExceptionResolver类异常处理。二、用法 首先,我们这里使用了thymeleaf视图组件,引入依赖如下:<dependency> <groupId>org.springframework原创 2021-08-24 18:51:17 · 6070 阅读 · 0 评论 -
SpringBoot异常处理 之 如何使用最简单的方式覆盖默认错误页面?
一、用法简介 前面一篇内容中,我们学习了SpringBoot默认的异常处理机制,但是在实际的工作中,这种方式肯定是无法满足个性化的需求的,如何实现自定义错误页面呢?我们这里将会使用一种最简单的方式来实现,即通过在src/main/resources/templates 目录下创建 error.html 页面实现,具体用法如下:本篇内容旨在学习该用法背后的实现机制,所以我们先简单演示用法,重点在后面的分析。 首先,因为这里我们使用到了thymeleaf视图组件,所以需要引入该依赖,如下:<原创 2021-08-23 23:35:46 · 576 阅读 · 1 评论 -
SpringBoot默认的处理异常机制,默认错误页面是怎么产生的呢?
一、前言 在基于SpringBoot开发的过程中,经常遇见“Whitelabel Error Page”的错误页面,比如:404错误:500错误: 在实际开发中,不止上面的这两种情况,还有很多其他情况,这里不再一一列举,这些错误页面是如何产生的,是如果工作的呢?其实这就是SpringBoot提供的默认的异常处理机制。我们这一节就来学习SpringBoot默认的异常处理机制。二、主要接口或类 在SpringBoot实现的异常处理逻辑中,有几个常用的接口或类,我们这里先简单了解一下:E原创 2021-08-21 20:17:17 · 1013 阅读 · 0 评论 -
Elasticsearch学习笔记:基本概念
1、常见概念1.1、索引 索引是具有相同结构的文档集合,有点儿类似关系型数据库中表的概念。1.2、映射 映射像关系数据库中的表结构,每一个索引都有一个映射,它定义了索引中的每一个字段类型,以及一个索引范围内的设置。索引映射可以提前设定,也可以在第一次存储文档的时候自动识别。2、常见操作2.1、创建索引PUT /index_test{ "settings":{ "index":{ "number_of_shards": "2", "number_of_r原创 2021-03-23 22:26:56 · 1266 阅读 · 0 评论 -
阿里的过来人告诉你,数据中台为什么搞不下去了?
搞数据的都知道,阿里发明了数据中台,然后“中台”这个概念就马上成为了国内大多数企业趋之若鹜的风口,真正实施后却发现中台与数据平台、数据湖等项目大差不差,又有好多机构开始忙着拆中台了,中台虽然还没到人见人烦的地步,但总体来讲已经不那么受待见了。 我发现网上也有很多文章进行分析,但大多是长篇大论,表述也过于技术,今天我就用最通俗的话跟大家解释一下。首先,先解释一下中台的概念 首先,不论是数据中台,还是业务中台,都属于中台的一种。而中台的职责在于抽象共性形成通用服务能力。 而数据中台就是抽象处理转载 2021-03-19 14:02:09 · 2214 阅读 · 0 评论 -
学习笔记:常见的分布式限流解决方案(二)之 基于Nginx的网关限流和基于Redis的中间件限流
1、前言 在《限流概念、基于Guava RateLimiter的客户端限流》中,学习了分布式限流的概念、常见算法和基于Guava RateLimiter客户端限流的实现,这里将继续学习另外的限流方案:基于Nginx的网关限流和基于Redis的中间件限流。关于限流组件的使用,请参考《Spring Cloud Alibaba入门之分布式系统的流量防卫兵Sentinel》相关内容。2、基于Nginx实现的网关限流 Nginx按照请求速率限流使用的是漏桶算法,前面已经学习过了,漏桶算法可以保证请求的实时处原创 2021-02-20 19:00:19 · 965 阅读 · 5 评论