一个注解实现权限判断
传统判断传统对用户权限的判断通常通过调用权限Service的某个方法,比如: 1234567// 获取用户权限Role userRole = RoleService.getRole(user);// 判断权限是否合格if (userRole != Admin) { throw new RuntimeException("权限不足")}// 执行逻辑.... 这样的代码是不是重复性很高,在需要判断权限的每个地方都要这么写一遍,那么就可以抽出来成一个模板,还可以通过aop在方法外判断,保持方法内的逻辑清晰。 权限注解通过权限注解指定方法需要的权限。 123456789101112131415161718/** * 用于权限校验当前用户 * * @author <a href="https://github.com/Ershi-Gu">Ershi-Gu</a> * ...
策略+工厂设计模式实现动态选择
设计目标根据项目需求,设计一个灵活的物品验证系统,使其能够根据不同的物品类型,动态地选择对应的验证逻辑。不同类型的物品可能需要不同的验证规则,因此系统应能够通过物品类型,自动选择合适的验证器进行验证。本次用到 **策略+工厂 **的设计模式。 策略模式与工厂模式简介策略模式(Strategy Pattern)策略模式定义了一系列算法(或策略),并将每个算法封装起来,使得它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端,使得算法的使用更加灵活。 在我们的例子中,策略模式将被用于选择合适的验证逻辑,针对不同的物品类型,选择不同的验证器进行验证。 工厂模式(Factory Pattern)工厂模式通过定义一个创建对象的接口,让子类决定实例化哪一个类。它将对象的创建过程封装起来,客户端不需要直接使用new操作符来创建对象,从而减少了与具体实现的耦合度。 在我们的例子中,工厂模式用于根据物品类型动态地获取相应的验证器。 二者区别 策略模式的主要目的是行为的动态选择,关键点是策略的封装和调用。 ...
一个注解实现分布式锁
原生写法平常在用 Redisson 的时候都是怎么写分布式锁的呢? 1234567RLock lock = redissonClient.getLock(key);boolean lockSuccess = lock.tryLock(waitTime, timeUnit);if (lockSuccess) { 执行业务代码...} final { lock.unlock();} 是不是都用的这样子的模板,那既然是模板,我们就可以把他抽出来,不用每次都去写这么一大串了。 分布式锁工具类我们可以把模板抽出来放到一个工具类 LockService 中,每次要加锁的时候只需要传入锁的一些参数,以及需要加锁的代码(通过函数式接口传入)。 123456789101112131415161718192021222324252627@Service@Slf4jpublic class LockService { /** * 使用分布式锁执行给定的操作 * * @param key 锁的键 ...
WebSocket握手认证实践
注意!本实践基于 Netty 网络通讯工具。 WebSocket 是一种全双工通信协议,它允许客户端和服务器之间的持续连接。在建立 WebSocket 连接之前,必须通过 HTTP 完成一次握手,称为 WebSocket 握手。在握手过程中,通常可以实现 身份认证 和 权限验证,以确保只有合法用户能够建立 WebSocket 连接。 实战背景现在设想这样一个场景,用户登录使用在线聊天软件时,通常使用 WebSocket 连接建立通道实现”客户端-服务器“双向通信,而通道在登录后会标识其为哪个用户。 但用户可能刷新前端,websocket 连接就重建了,这时难道用户需要再次登录么,很麻烦对吧。所以需要携带一个登录凭证,在后续的操作中,根据登录凭证(Token)就能重建连接并进行身份验证。我们需要知道的是每个 channel 对应的用户是谁。 传统方案 通常情况下,首先想到的可能是会把登录认证和建立 websocket 连接分开来,但这样一来一回需要三次请求,可能会提高前端反馈延迟。而第一步和第二步能否合并在一起呢,在 websocket...
统一线程池管理最佳实践
问题描述在讲述时间方案时,先来看一下JDK提供的默认线程池工具类Executors创建线程有哪些问题: 使用 Executors.newCachedThreadPool() 会为每个任务分配一个线程。如果任务量大,线程数量将迅速增加,可能导致 CPU 过载 或 内存溢出(OOM)。 使用 Executors.newFixedThreadPool() 任务队列为无界队列 LinkedBlockingQueue,这意味着如果任务过多,队列会不断增长,占用内存,可能导致 内存泄漏。 工具类虽然用着方便,但是也有不少问题出现,主要在于我们没法自定义一些参数。同时我们也需要更加显示的声明线程池,不同类型的任务最好使用不同的线程池,保障任务不会出现互相干扰的情况下,同时也增加了系统的安全性,如果某一个线程池崩了不会影响整个系统。 为了解决上面这些问题,我们就需要自建线程池。 自建线程池这里使用 Spring 提供的线程池 ThreadPoolTaskExecutor,相比于 JUC 包提供的 ThreadPoolExecutor...
Token 认证技术方案
用户在完成扫码登录后,应当返回一个登录凭证给前端保存,以方便下一次登录时不需要重复“扫码 => 登录”这个麻烦的步骤,而这个登录凭证(Token)一般就由服务器生成并返回。 Token 生成方式Token 的生成方式主要有以下几种: 随机字符串:可以使用一些随机数生成算法,如 :UUID、Snowflake 等来生成一个随机的字符串作为 Token。由于随机字符串本身就是随机分布的,因此具有很高的安全性。 JWT(JSON Web Token):JWT 是一种基于 JSON 格式的开放标准(RFC 7519),用于在多方之间安全地传输信息。它将用户身份信息和权限等相关信息编码成一个 JSON 对象,并通过数字签名或者加密等方式进行验证和保护。JWT 除了可以用于 Token 登录外,还可以用于 API 认证、单点登录等场景。 SessionID。 通常的 Token 在服务器端的实现方式有这几个: 用 SessionID 充当 Token。 使用 Json Web Token (JWT) 中心化存储...
【Netty】网络编程学习
该文章仅用作个人学习笔记! 参考文章: 柏码知识库 | NIO 笔记(二)Netty框架专题 Java IO 模型详解 | JavaGuide Netty | 工作流程图分析 & 核心组件说明 & 代码案例实践-阿里云开发者社区 选择器与 IO 多路复用常见的 IO 多路复用模型,采用选择器的方案实现。当服务器与客户端存在某一状态(连接请求、读、写)时,才会进行处理,相比于传统的 IO(接收完客户端请求后,会阻塞等待读操作) 当有多个连接到服务器时,有下面的方式进行处理: select:当这些连接出现具体的某个状态时,只是知道已经就绪了,但是不知道详具体是哪一个连接已经就绪,每次调用都进行线性遍历所有连接,时间复杂度为...
自定义 link 卡片
本文转载自 阿力古,用于记录标签外挂实现自定义卡片的相关语法,方便后续查找使用,原文如下。 阿力古 源码修改link.js 在 \themes\butterfly\scripts\tag 文件夹下新建 link.js 并粘贴如下代码: 12345678910111213141516171819202122/** * link * {% link url,title,favicon,desc %} * {% link 链接,标题,图标,介绍 %} */'use strict'let defaultIcon = '<svg t="1670307855063" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="19066" width="200"...
【说说】使用 Artitalk 新增说说功能
Artitalk 是基于 LeanCloud(快速搭建后端云服务)的可实时发布说说的 js 前提 你需要有一个域名 LeanCloud 国际版已不支持中国大陆,需要代理才能访问到说说 LeanCloud 大陆版需要一个备案的域名,最好准备 SSL 证书 LeanCloud 相关准备直接按照 Artitalk.js 官方文档完成操作即可: Artitalk.js基于的可实时发布说说的 js 前往 LeanCloud 国际版,注册账号。 注册完成之后根据 LeanCloud 的提示绑定手机号和邮箱。 绑定完成之后点击创建应用,应用名称随意,接着在结构化数据中创建 class,命名为 shuoshuo。【结构化数据名字一定要为shuoshuo,后续Artitalk才能识别到!】 在你新建的应用中找到 内建账户 下的 用户管理。点击 添加用户,输入想用的用户名及密码。 回到结构化数据中,点击 class 下的 shuoshuo。找到权限,在 Class 访问权限中将 add_fields 以及 create...
【Artalk】一文教会你部署整合博客评论功能
前言 注意:在看本篇文章操作之前需要先准备一台服务器哦! 在写博客之前我也写过一些文章,觉得笔记和博客的区别就在于后者可以有更多的和读者互动的功能,评论就是中间很重要一个互动渠道。 本文采用 Hexo + Butterfly + Artalk + 一台服务器实现评论功能接入博客。该方案使用的 Artalk 和 Disqus、Gitalk 等其他评论框架不同的地方在于,Artalk 采用私有部署,在国内的服务器响应会更快。效果如下: Artalk 部署介绍Artalk 是一款简单易用但功能丰富的评论系统,你可以开箱即用地部署并置入任何博客、网站、Web 应用。👋 Hello Friend | Artalk 在我看来 Artalk 是一款轻量小巧但又不缺乏功能的系统,包括但不限于:社交登录、邮件通知、多元推送、图片上传、评论审核、markdown等等(以上来自官方文档介绍) Docker 部署Artalk 提供多种部署方式📦 程序部署 | Artalk,我觉得其中最简单就是 Docker 了,一个命令直接解决。 首先你需要在服务器上安装一个...