自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(242)
  • 资源 (6)
  • 问答 (2)
  • 收藏
  • 关注

原创 在SpringSecurity + SpringSession项目中如何实现当前在线用户的查询、剔除登录用户等操作

在前一篇《在SpringBoot项目中整合SpringSession,基于Redis实现对Session的管理和事件监听》

2023-09-15 10:52:04 1052

原创 在SpringBoot项目中整合SpringSession,基于Redis实现对Session的管理和事件监听

SpringSession是基于Spring框架的Session管理解决方案。它基于标准的Servlet容器API,提供了Session的分布式管理解决方案,支持把Session存储在多种场景下,比如内存、MongoDB、Redis等,并且能够快速集成到Spring应用程序中。使用SpringSession实现Session管理,可以有效解决Session共享的问题,提升系统的可伸缩性和可靠性。

2023-09-15 10:12:22 2092

原创 使用CryptoJS实现Vue前端加密,Java后台解密的步骤和方法

CryptoJS 是一个 JavaScript 库,提供了一系列密码学函数和工具,用于加密、解密、生成摘要等任务。它支持多种加密算法,包括常见的对称加密算法(如 AES、DES)和非对称加密算法(如 RSA)。同时,CryptoJS还包括了ECB和CBC两种模式,其中ECB模式:全称Electronic Codebook(电码本),在ECB模式中,每个明文分组都被单独加密,且每个明文分组都被加密为相同的密文分组。也就是说,如果两个明文分组相同,那么它们的密文分组也相同。CBC模式。

2023-09-11 14:40:02 4490

原创 基于SpringBoot + Vue的项目整合WebSocket的入门教程

WebSocket是一种网络通信协议,可以在单个TCP连接上进行全双工通信。它于2011年被IETF定为标准RFC 6455,并由RFC7936进行补充规范。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。这使得客户端和服务器之间的数据交换变得更加简单,并允许服务端主动向客户端推送数据。

2023-09-08 17:41:36 850

原创 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 647

原创 Vue学习笔记 之 History 路由 和 Hash 路由的区别 及 History 模式时,Nginx的配置方式

History 模式时,服务器需要进行相应的配置,以确保在刷新页面或直接访问某个子路由时,仍能正确返回前端路由对应的页面。这是因为在 History 模式下,前端的路由和后端的路由是分离的,后端需要将所有路由请求都重定向到前端的入口页面。在 Vue Router 中,Hash 模式是一种简单且常见的路由模式,它使用 URL 中的哈希(#)来管理路由。然后,修改路由配置文件./router/index.js,在该文件我们配置了History 模式,同时还需要配置base路径,保证路由访问时的正确。

2023-07-06 11:56:52 3239

原创 微前端框架MicroApp入门学习笔记(一)

微前端是一种架构风格,旨在通过将前端应用程序拆分为更小、更可管理的部分,使多个团队能够独立开发、部署和维护这些部分,从而实现前端的可扩展性和可维护性。MicroApp框架是京东出品的一种用于构建微前端架构的开源框架,旨在帮助开发者更好地构建和管理复杂的前端应用程序。轻量级:框架本身体积小,加载速度快,不会给应用程序带来额外的负担。插件化:支持插件机制,可以根据需要灵活添加和扩展功能。组件化:采用组件化的开发模式,方便开发者进行模块化开发和复用。

2023-06-29 22:38:39 1736

原创 微信小程序实现订阅消息推送的实现步骤

而Post方法, 当用户在微信小程序中主动订阅一次性消息时,腾讯服务器将请求Post的接口,发送用户的相关行为事件结果到开发者服务器,只有用户订阅的用户才允许进行消息推送,其实这里接收的不只是消息订阅事件,各类的交互事件都在这里进行接收的。在实际应用中,我们应该维护一张需要推送消息的微信用户数据表,包括该用户是否已订阅,微信用户的openid等信息,这里暂时演示,省略了该信息,直接固定硬编码了模板ID、消息内容、微信用户openId等信息。完成上述工作后,启动服务,先通过微信小程序进行消息订阅,

2023-06-14 12:47:17 20834 12

原创 第一次使用ThreadPoolTaskExecutor实现线程池的经历,反复修改了多次代码才正常使用

在一个向第三方平台推送消息的场景中,为了提高程序的执行效率,每次发送消息,都创建一个新的线程来完成发送消息的任务,为了提供线程的使用性能,我选择了ThreadPoolTaskExecutor线程池,结果在使用的过程中,出现了较多的问题,这里记录一下避免以后再出现类似的错误(这些错误是不应该出现的,还是对ThreadPoolTaskExecutor使用不熟悉造成的)。

2023-06-13 15:40:51 3240

原创 uniapp学习笔记——基于<uni-file-picker>组件和uni.uploadFile()方法实现图片上传

  在编辑页面,有图片字段需要选择手机图片进行上传、预览、回显、删除等,尤其是当提交表单后,再次选择编辑该表单页面时,如何正确的显示图片,并保证再次提交时,可以没有异常。这里主要记录了一种在编辑表单时(图片字段返回的是图片地址)的一种处理方式,不一定是最佳实践,但是可以实现功能的正常使用。  组件和uni.uploadFile()方法在官方文档已经有非常详细的介绍了,这里只是简单说明一下,需要了解详细信息的请移步官方文档进行查看。  文件选择上传组件,可以选择图片、视频等任

2023-06-11 22:41:54 12024

原创 MinIO快速入门——在Linux系统上安装和启动

MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统。客户端支持Java,Net,Python,Javacript, Golang语言。MinIO系统,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。

2023-06-09 19:50:32 9757 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 855 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 931

原创 基于Mybatis使用MySql存储过程,实现数据统计功能

作为一个工作了很多年的程序员来说,没有在实际工作中真正使用过存储过程,其实对存储过程本身有过了解和学习,在日常的学习中,也会看过一些存储过程的相关介绍,不过“纸上得来终是浅”,正好这次做统计分析的业务功能时,适合使用存储过程的机会,就搞起来了,顺便记录一些遇见的一些问题,方便后续查看和学习。

2023-04-26 17:20:02 686

原创 SpringBoot中@ConfigurationProperties注解的常见使用(学习笔记)

  @ConfigurationProperties是springboot提供读取配置文件的一个注解。其对应的bean的后置处理器为ConfigurationPropertiesBindingPostProcessor类,它是实现了BeanPostProcessor接口,在bean被实例化后,会调用后置处理,递归的查找属性,通过反射注入值,对大多数属性而言强制需提供其setter和getter方法。  @ConfigurationProperties注解加载配置文件三种常见的用法,如下:  这里需要注意的

2022-12-07 08:46:54 3231 1

原创 vue集成cesium入门教程(2)加载各类地图(高德/天地图/Mapbox等)

这篇内容是《vue集成cesium入门教程》的第二篇,这里将记录通过Cesium加载高德、天地图、Mapbox等地图。将分别介绍三种地图的接入方法,其中可能会涉及到的用户注册获取token等内容。注册Mapbox后,登录到Mapbox后,进入该页面,可以创建自定义的地图。创建好的地图样式如下所示:通过上述操作,我们可以获取自定义地图的accessToken和styleId等信息,这个在代码中需要用到。如果第一次创建地图,需要点击“New style”按钮,然后选择模板。

2022-10-09 10:00:25 5481 2

原创 vue集成cesium入门教程(1)环境搭建、初始化三维地球

这篇内容是《vue集成cesium入门教程》的第一篇,我将记录在vue中集成cesium并实现页面的初始化(显示三维地图页面)等学习内容。

2022-09-29 17:01:44 2047

原创 JSqlParser入门教程之常用示例

JSqlParser是一个SQL语句解析器,它可以把SQL转换为Java对象进行操作的工具包,支持Oracle,SqlServer,MySQL,PostgreSQL等常用数据库。

2022-09-20 21:00:00 2978 1

原创 并发编程学习笔记 之 常用并发容器的概念及使用方法

所有线程对该容器的读取操作将不会对数据集合产生加锁的动作,从而使得高并发高吞吐量的读取操作变得高效,但是当有线程对该容器中的数据集合进行删除或增加等写操作时才会对整个数据集合进行加锁操作,然后将容器中的数据集合复制一份,并且基于最新的复制进行删除或增加等写操作,当写操作执行结束以后,将最新复制的数据集合引用指向原有的数据集合,进而达到读写分离最终一致性的目的。并发容器是指在高并发应用程序的使用过程中,这些容器(数据结构)是线程安全的,而且在高并发的程序中运行它们会有高效的性能表现。...

2022-07-29 17:44:12 467

原创 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 1424

原创 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 284

原创 Ribbon学习笔记一

使用Ribbon,主要就是RestTemplate的使用。IClientConfig是Ribbon客户端的配置,我们可以通过它配置Ribbon相关的内容。IRule是负载均衡策略接口,也就是说,具体的负载均衡是通过它来提供算法的。IPing接口能判断服务实例是否可用。服务实例存在上线、下线和故障等多种可能,通过IPing接口能判定服务实例是否可用。ServerList是从Eureka服务端拉取服务实例清单,其中包含注册过的服务实例(包括可用的和不可用的)。ServerListFilter是服务实例过滤.

2022-07-26 20:35:21 265

原创 在uni-app项目中,如何实现微信小程序openid的获取

因为uni的login()方法封装了微信wx.login()方法,所以我们这里直接调用的是uni.login()方法,返回code后,再通过getOpenId()方法调用后台接口即可。在开发微信小程序的时候,我们需要当前的微信小程序用户和我们的后台用户建立关联,这个时候,我们就需要通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。我们可以获取微信小程序用户的openid作为唯一标识,和后台用户进行绑定,获取方式也比较简单,这里做一下记录,方便后续可以快速查找并使用。..

2022-07-26 16:46:48 10715

原创 并发编程学习笔记 之 ReentrantLock实现原理的探究

在前面我们已经了解到Lock接口,是对锁操作方法的一个基本定义,它提供了synchronized关键字所具备的全部功能方法,而ReentrantLock类不仅完全实现了显示锁Lock接口所定义的接口,也扩展了对使用显式锁Lock的一些监控方法。同时,我们也尝试使用ReentrantLock实现了对共享资源的同步访问,这一节我们来深入了解,这些功能是如何实现的。https。...

2022-07-22 22:21:30 198

原创 并发编程学习笔记 之 Lock锁及其实现类ReentrantLock、ReentrantReadWriteLock和StampedLock的基本用法

我们这篇内容主要学习了Lock锁及其实现类ReentrantLock、ReentrantReadWriteLock和StampedLock的基本用法,关于实现原理和读写锁的饥饿写问题产生的原因等,我们在后续内容中逐渐进行整理。httpshttps。

2022-07-21 13:23:08 361

原创 并发编程学习笔记 之 工具类CountDownLatch、CyclicBarrier详解

  CountDownLatch类允许一个或者多个线程去等待其他线程完成操作。CountDownLatch构建时接收一个int型参数,表示要等待的工作线程的个数,每个子任务执行完成后使用countDown方法进行减1操作,等待线程使用await方法进行等待操作,直到所有子任务完成,等待线程就会被唤起执行。  创建子线程,模拟执行任务,当子任务执行完成后,主线程被唤醒继续执行,具体实现如下:CountDownLatch常用方法1、Sync 内部类  CountDownLatch通过内部类Sync来实现

2022-07-12 22:00:00 453

原创 并发编程学习笔记 之 工具类Semaphore(信号量)

  Semaphore(信号量)是一个线程同步工具,主要用于在一个时刻允许多个线程对共享资源进行并行操作的场景。通常情况下,使用Semaphore的过程实际上是多个线程获取访问共享资源许可证的过程。  Semaphore内部逻辑:  这里模拟最大人数的场景,当人数达到上限收,后续的线程就无法进入,当有信号量被释放后,后续的线程可以继续进入。  在上述示例中,线程“Thread-7”等到有是否资源后,又可以获取进入资格了。  release方法: 在Semaphore设计中,并未强制要求执行releas

2022-07-12 21:00:00 244

原创 并发编程学习笔记 之 原子操作类AtomicReference、AtomicStampedReference详解

  在《并发编程学习笔记 之 原子操作类AtomicInteger详解》中,我们学习了原子操作类AtomicInteger的用法,类似的还有AtomicLong、AtomicBoolean等类型,这些都是针对基本类型定义的原子性操作,那么针对对象是否有原子性操作呢?这一节,我们就开始学习原子操作类AtomicReference,看看如何实现针对对象的原子性操作。  这里我们改写了《Java高并发编程详解:深入理解并发核心库》一书中的例子,设计一个个人银行账号资金变化的场景:  首先,我们设计一个个人银行账号

2022-07-12 00:05:58 679

原创 并发编程学习笔记 之 原子操作类AtomicInteger详解

  原子类型就是一种无锁的、线程安全的类型,解决了在多线程场景下使用基本数据类型和引用类型的线程不安全的问题。具体示例如下:  在上述代码中,运行了10个线程,每个线程均对count变量进行了1000的计数器自增操作,理想情况下,运行结束后,这个时候count的值应该是10000,但是实际情况,每次结果都可能不相同,有可能是10000,也有可能是小于10000的其他值。为什么出现这种情况呢?其实就是多个线程对count共享变量进行并行操作,导致部分线程的计算结果对其他线程不可见,造成了数据丢失。那么在共享

2022-07-07 17:42:58 1854

转载 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 140

原创 Java8的Stream调试神器——StreamTrace调试工具

  在项目中往往充斥着各种各样的集合遍历操作,“看起来难受,写起来手酸”。自从 Java 8 开始,利用新增的Stream抽象,完美解决了以上问题。利用Stream进行数据处理,极大程度上简化了代码,提升了开发效率,但是Stream编程也给程序员的调试带来了极大的不方便,很多程序员可能都经历过调试Stream的痛苦。现在Idea 推出的StreamTrace功能,可以详细看到每一步操作的关系、结果,非常方便进行调试,为程序员带来了“福音”。  先熟悉一下,下面的代码,实现逻辑:第一步:筛选“cloth”类型

2022-07-07 13:47:56 701

原创 Java8 Streams用法总结大全 之 Collector用法详解

  在《Java8 Streams用法总结大全 之 Stream中的常见操作》中,我们已经学习了Stream中的常用操作,其中也提到了collect()的用法,当时只是通过入参Collectors.toList()实现了把Stream转为List集合的功能,其实collect()还有很多其他的用法,入参就是实现了Collector接口的对象,同时Collectors可以看作是Collector的工厂类,其为我们提供了非常多的内建Collector的方法,具体如何使用,我们一起来学习一下。  在前面提到的co

2022-06-26 16:31:49 2918

原创 Java8 Streams用法总结大全 之 Stream中的常见操作

  Java 8中的Stream是支持顺序或者并行操作的元素序列,它不是一个容器。它并不是用来存储数据的,而是对JDK中Collections的一个增强,它专注于对集合对象既便利又高效的聚合操作。它不仅支持串行的操作功能,而且还借助于JDK 1.7中的Fork-Join机制支持并行模式,开发者无须编写任何一行并行相关的代码,就能高效方便地写出高并发的程序。  在JDK 1.8版本中,Stream为容器的使用提供了新的方式,它允许我们通过陈述式的编码风格对容器中的数据进行分组、过滤、计算、排序、聚合、循环等操

2022-06-25 13:10:34 1451

原创 关于SpringBoot默认日志Logback的一些事儿

声明:本博客内容,均根据网络上的博客内容汇总而成,其中大部分内容以及在项目中进行验证和测试。主要参考文章,在文末以及注明。1、常用的日志框架  在日常的Java开发中,常见的日志框架有如下这些:Log4j最早的日志组件是Apache 提供的Log4j。Log4j 能够通过配置文件轻松的实现日志系统的管理和多样化配置,是我们接触比较早的日志组件,几乎成了java 日志的标准,如它定义的Looger、Appender、Level等概念一直沿用至今。JUL(Java Util Logging).

2022-05-04 18:33:34 2110

原创 通过简单的脚本在Linux环境实现Mysql数据库的定时备份(Mysqldump命令备份)

1、mysqldump命令  mysqldump 是 mysql 用于转存储数据库的实用程序。它主要产生一个 SQL 脚本,其中包含从头重新创建数据库所必需的命令 CREATE TABLE INSERT 等。命令:mysqldump -h主机地址 -u用户名 -p数据库密码 数据库名 表1 表2 > 文件名  如果用户名需要密码,则需要在此命令执行后输入一次密码核对;如果数据库用户名不需要密码,则不要加“-p”参数,导入的时候相同。注意输入的用户名需要拥有对应数据库的操作权限,否则无法导出数据

2022-04-28 16:23:36 4677

原创 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 6348 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 5008 1

原创 SpringSecurity OAuth2 获取Token端点TokenEndpoint、Token授权TokenGranter接口 详解

1、前言  在《授权服务器是如何实现授权的呢?》中,我们可以了解到服务端实现授权的流程,同时知道,当授权端点AuthorizationEndpoint生成授权码时,就会重定向到客户端的请求地址,这个时候,客户端就会拿着授权码再来授权服务器换取对应的Token,这篇内容,我们就详细分析如何使用授权码code换取Token的。在前面文章中,我们可以了解到客户端是通过“/oauth/token”来换取token的,该接口对应TokenEndpoint类的postAccessToken()方法,我们这篇文章就围绕

2022-01-09 16:30:14 15210 2

原创 SpringSecurity OAuth2授权端点AuthorizationEndpoint、授权码AuthorizationCodeServices 详解

1、前言  在《授权服务器是如何实现授权的呢?》中,我们可以了解到服务端实现授权的流程,同时了解"/oauth/authorize"授权接口在AuthorizationEndpoint类中定义。这一节,我们将详细分析AuthorizationEndpoint类的实现。2、AbstractEndpoint抽象类  AuthorizationEndpoint授权端点继承自AbstractEndpoint抽象类,这里我们先分析一下AbstractEndpoint抽象类的实现逻辑。  AbstractEnd

2022-01-09 16:29:44 6618

原创 基于SpringSecurity OAuth2 + JWT实现统一认证中心

1、前言  在《基于SpringSecurity OAuth2实现的统一认证中心》中,已经实现了基于opaqueToken的统一认证方式,这里我们将基于这篇内容,进行基于JWT方式的实现。相似的内容,这里将不再重复,所以看这篇内容的童鞋,请先移步《这里》了解基于opaqueToken方式的实现过程。2、JWT 简介  Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。该Token被设计为紧凑且安全的,特别适用于分布式站点

2021-12-24 10:27:30 2799 10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除