当前位置: 首页 > news >正文

责任链模式优化 文章发布的接口(长度验证,敏感词验证,图片验证等环节) 代码,示例

需求:后端需要提供一个文章发布的接口,接口中需要先对文章内容进行如下校验,校验通过后才能发布

1. 文章长度不能超过1万个字符
2. 不能有敏感词
3. 文章中图片需要合规

责任链相当于一个链条一样,链条上有很多节点,节点与节点之间形成了一个单向的链表。

每个节点相当于一个处理步骤,一个任务过来后,会交给链条上第一个节点进行处理,第一个节点处理后再传递给下一个节点,下一个节点处理完成后,继续向后传递。

目前文章发布中的校验有下面3个步骤,每个步骤相当于责任链上一个节点,每个步骤对应一个类,如果要进行扩展,只需要添加一个类,然后调整下链表的顺序便可。



具体实现
1 pom.xml

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId>
</dependency>

2 pojo类,ArticlePublishRequest: 数据传输对象,封装了文章发布请求的数据。

import lombok.Data;@Data
public class ArticlePublishRequest {// 文章内容private String content;
}

3 IArticlePublishCheck: 定义文章发布校验的接口,包含校验和设置下一个校验器的方法

import com.example.demo_23.aaaaa.dto.ArticlePublishRequest;
public interface IArticlePublishCheck {/*** 对文章进行校验** @param req*/void check(ArticlePublishRequest req);/*** 设置下一个文章校验器,并返回下一个校验器** @param next* @return*/IArticlePublishCheck setNext(IArticlePublishCheck next);
}

4 AbstractCheck: 提供责任链模式的抽象实现,包含默认的校验流程和设置下一个校验器的逻辑

import com.example.demo_23.aaaaa.dto.ArticlePublishRequest;public abstract class AbstractCheck implements IArticlePublishCheck {private IArticlePublishCheck next;@Overridepublic void check(ArticlePublishRequest req) {//校验this.checkIn(req);//调用下一个校验器进行校验if (this.next != null) {this.next.check(req);}}/*** 子类实现** @param req*/protected abstract void checkIn(ArticlePublishRequest req);@Overridepublic IArticlePublishCheck setNext(IArticlePublishCheck next) {this.next = next;return this.next;}
}

5 校验具体实现类

  • ContentLengthCheck: 实现内容长度校验,确保文章内容长度在合理范围内。

  • ImageCheck: 实现图片合法性校验,确保文章中的图片是合法的(当前未实现具体逻辑)。

  • PublishCountCheck: 实现发布次数校验,限制用户每天发布文章的数量。

  • SensitiveWordsCheck: 实现敏感词校验,确保文章内容不包含敏感词汇。

import com.example.demo_23.aaaaa.dto.ArticlePublishRequest;
import org.apache.commons.lang3.StringUtils;/*** 内容长度校验*/
public class ContentLengthCheck extends AbstractCheck {@Overrideprotected void checkIn(ArticlePublishRequest req) {if (StringUtils.length(req.getContent()) < 1 || StringUtils.length(req.getContent()) > 10) {throw new RuntimeException("文章长度不能超过10000个字符");}}
}---------------------------------------------import com.example.demo_23.aaaaa.dto.ArticlePublishRequest;
/*** 图片合法性校验*/
public class ImageCheck extends AbstractCheck {@Overrideprotected void checkIn(ArticlePublishRequest req) {//校验图片是否合法?不合法则抛出异常boolean checked = true;if (!checked) {throw new RuntimeException("图片不合法");}}
}---------------------------------------------import com.example.demo_23.aaaaa.dto.ArticlePublishRequest;
import java.util.concurrent.atomic.AtomicInteger;/*** 发布次数校验器,每日限制5篇文章*/
public class PublishCountCheck extends AbstractCheck {AtomicInteger publishCount = new AtomicInteger(0);@Overrideprotected void checkIn(ArticlePublishRequest req) {if (publishCount.incrementAndGet() > 5) {//发布次数校验,比如每日只允许发布5篇文章throw new RuntimeException("今日发布已满,请明日继续分享!");}}
}---------------------------------------------import com.example.demo_23.aaaaa.dto.ArticlePublishRequest;
import java.util.Arrays;
import java.util.List;/*** 敏感词校验*/
public class SensitiveWordsCheck extends AbstractCheck {@Overrideprotected void checkIn(ArticlePublishRequest req) {//敏感词列表List<String> sensitiveWordsList = Arrays.asList("逼");//有敏感词则抛出异常for (String sw : sensitiveWordsList) {if (req.getContent().contains(sw)) {throw new RuntimeException("有敏感词:" + sw);}}}
}

6 ArticleCheckConfig: 配置类,负责创建和配置责任链中各个校验器,并设置它们之间的顺序。

import com.example.demo_23.aaaaa.article.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ArticleCheckConfig {@Beanpublic ContentLengthCheck contentLengthCheck() {return new ContentLengthCheck();}@Beanpublic SensitiveWordsCheck sensitiveWordsCheck() {return new SensitiveWordsCheck();}@Beanpublic ImageCheck imageCheck() {return new ImageCheck();}@Beanpublic PublishCountCheck publishCountCheck() {return new PublishCountCheck();}@Beanpublic IArticlePublishCheck articlePublishCheck() {ContentLengthCheck firstCheck = this.contentLengthCheck();firstCheck.setNext(this.sensitiveWordsCheck()).setNext(this.imageCheck()).setNext(this.publishCountCheck());return firstCheck;}
}

7 ArticleController: 控制器类,处理文章发布请求,使用责任链进行校验。

import com.example.demo_23.aaaaa.article.IArticlePublishCheck;
import com.example.demo_23.aaaaa.dto.ArticlePublishRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ArticleController {@Autowiredprivate IArticlePublishCheck articlePublishCheck;/*** 发布文章,责任链版本实现,更容易扩展** @param req* @return*/@PostMapping("/article/publishNew")public Object publishNew(@RequestBody ArticlePublishRequest req) {try {this.articlePublishCheck.check(req);return "发布成功";} catch (RuntimeException e) {return "发布失败:" + e.getMessage();}}
}

相关文章:

责任链模式优化 文章发布的接口(长度验证,敏感词验证,图片验证等环节) 代码,示例

需求&#xff1a;后端需要提供一个文章发布的接口&#xff0c;接口中需要先对文章内容进行如下校验&#xff0c;校验通过后才能发布 1. 文章长度不能超过1万个字符 2. 不能有敏感词 3. 文章中图片需要合规 责任链相当于一个链条一样&#xff0c;链条上有很多节点&#xff0c;节…...

Java流程控制语句——条件控制语句详解(附有流程图)#Java条件控制语句有哪些?#if-else、switch

在 Java 编程中&#xff0c;条件控制语句用于控制程序的执行路径&#xff0c;决定根据某些条件来选择执行某段代码或跳过某段代码。它们是 Java 编程的重要组成部分&#xff0c;帮助开发者根据不同的输入、状态或数据流来编写更加灵活和动态的代码。在本文中&#xff0c;我们将…...

十一、SOA(SOA的具体设计模式)

我们现在深入学习SOA的具体设计模式。SOA架构中的设计模式主要是指导服务如何设计、实现、部署和管理&#xff0c;确保服务的松耦合、高可用性、扩展性和复用性。SOA常见的设计模式可以分为以下几类&#xff1a; 1. 服务层次设计模式 1.1. 基础服务&#xff08;Fundamental S…...

Mybatis原理

一. 为什么要使用Mybatis? 1.1 jdbc的使用步骤 首先&#xff0c;在pox.xml中引入MySQl驱动的依赖 第一步, Class.forName 注册驱动 第二步&#xff0c;获取一个Connection。 第三步&#xff0c;创建一个Statement对象。 第四步&#xff0c;execute()方法执行SQL。execute()方…...

黑马头条day3-2 自媒体文章管理

前边还有一个 素材列表查询 没什么难度 就略过了 查询所有频道和查询自媒体文章也是和素材列表查询类似 就是普通的查询 所以略过了 文章发布 这个其实挺复杂的 一共三张表 一个文章表 一个素材表 一个文章和素材的关联表 区分修改与新增就是看是否存在id 如果是保存草稿…...

JinDouYun性能测试工具使用方法

1.功能介绍 2. 安卓端支持安卓6及以上的版本&#xff0c;ios支持大部分版本 3. 可以测试游戏&#xff0c;视频&#xff0c;普通应用的性能数据&#xff0c;数据精准&#xff0c;低延迟&#xff0c;无侵入 4.工具下载链接 筋斗云 5.后续功能添加&#xff0c;高版本支持&…...

操作系统 | 学习笔记 | | 王道 | 5.3 磁盘和固态硬盘

5.3 磁盘和固态硬盘 5.3.1 磁盘 磁盘结构 磁盘&#xff1a;磁盘的表面由一些磁性物质组成&#xff0c;可以用这些磁性物质来记录二进制数据 磁道&#xff1a;磁盘的盘面被划分成一个个磁道。这样的一个“圈”就是一个磁道 扇区&#xff1a;一个磁道又被划分成一个个扇区&am…...

【Oauth2整合gateway网关实现微服务单点登录】

文章目录 一.什么是单点登录&#xff1f;二.Oauth2整合网关实现微服务单点登录三.时序图四.代码实现思路1.基于OAuth2独立一个认证中心服务出来2.网关微服务3产品微服务4.订单微服务5.开始测试单点登录 一.什么是单点登录&#xff1f; 单点登录&#xff08;Single Sign On&…...

WEB领域是不是黄了还是没黄

进入2024年后&#xff0c;WEB领域大批老表失业&#xff0c;一片哀嚎&#xff0c;个个饿的鬼叫狼嚎&#xff0c;为啥呢&#xff0c;下面是我个人的见解和看法。 中国程序员在应用层的集中 市场需求&#xff1a;中国的互联网行业在过去几年中经历了爆炸性增长&#xff0c;尤其是…...

Android系统:系统架构

文章目录 分层设计分块设计总结 分层设计 自上而下分为&#xff1a;应用层、应用架构层、系统运行层、硬件抽象层、Linux内核层 应用层 封装一系列系统App 应用架构层(Framework) 封装一系列运行App需要的Java框架 提供App开发需要的API 系统运行层(Libraries) 封装一系…...

NCNN 源码(1)-模型加载-数据预处理-模型推理

参考 ncnn 第一个版本的代码。 0 整体流程 demo&#xff1a;squeezenet ncnn 自带的一个经典 demo&#xff1a;squeezenet 的代码: // 网络加载 ncnn::Net squeezenet; squeezenet.load_param("squeezenet_v1.1.param"); squeezenet.load_model("squeezenet_…...

重修设计模式-结构型-享元模式

重修设计模式-结构型-享元模式 复用不可变对象&#xff0c;节省内存 享元模式&#xff08;Flyweight Pattern&#xff09;核心思想是通过共享对象方式&#xff0c;达到节省内存和提高性能的目的。享元对象需是不可变对象&#xff0c;因为它会被多处代码共享使用&#xff0c;要避…...

JavaScript 运算符

JavaScript 中的运算符可以根据其功能和用途分为几类。以下是主要的运算符类型及其用法&#xff1a; 1. 算术运算符 用于执行基本的数学运算。 : 加法 let sum 5 3; // 8- : 减法 let difference 5 - 3; // 2* : 乘法 let product 5 * 3; // 15/ : 除法 let quotient 5…...

3.js - 运动曲线

这个球&#xff0c;绕着这个红色的线圈转 代码 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControlslet scene,camera,renderer,controls nulllet moon,earth null// 根据&#xff0c;一系列的点&#xff0c;创建曲线 le…...

免费ppt模板哪里找?职场必备这些利器

一眨眼&#xff0c;9月份的尾声渐近&#xff0c;无论是学生还是职场人士&#xff0c;都开始准备着新一轮的演讲和报告。在这个忙碌的时期&#xff0c;一份精美的PPT模板能够大幅提升你的工作效率&#xff0c;让你的演示更加引人入胜。 不用担心高昂的版权费用&#xff0c;市场…...

wampserve 配置本地域名,出现错误

概述 今天更换了电脑&#xff0c;在本地安装和配置docker的时候&#xff0c;想用自定义域名访问NGINX容器&#xff0c;127.0.0.1和localhost都可以访问&#xff0c;但是自定义域名无法访问&#xff0c; 接着去捯饬已经使用的wampserver的集成环境&#xff0c;出现了同样的问题…...

MySQL慢查询优化指南

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 当遇到慢查询问题时&#xff0c;不仅影响服务效率&#xff0c;还可能成为系统瓶颈。作为一位软件工程师&#xff0c;掌握MySQL慢查询优化技巧至关重要。今天&#xff0c;我们就来一场“数据库加速之旅…...

怎么录制游戏视频?精选5款游戏录屏软件

对于热爱游戏的你来说&#xff0c;记录游戏中的精彩瞬间并分享给朋友或粉丝&#xff0c;无疑是一种享受。然而&#xff0c;在众多录屏软件中&#xff0c;如何选择最适合你的那一款&#xff1f;今天&#xff0c;我们就为大家精选了五款游戏录屏软件&#xff0c;需要的朋友快来选…...

论文阅读 - MDFEND: Multi-domain Fake News Detection

https://arxiv.org/pdf/2201.00987 目录 ABSTRACT INTRODUCTION 2 RELATED WORK 3 WEIBO21: A NEW DATASET FOR MFND 3.1 Data Collection 3.2 Domain Annotation 4 MDFEND: MULTI-DOMAIN FAKE NEWS DETECTION MODEL 4.1 Representation Extraction 4.2 Domain Gate 4.…...

LabVIEW软件出现Bug如何解决

在LabVIEW开发中&#xff0c;程序出现bug是不可避免的。无论是小型项目还是复杂系统&#xff0c;调试与修复bug都是开发过程中的重要环节。下文介绍如何有效解决LabVIEW软件中的bug&#xff0c;包括常见错误类型、调试工具、错误处理机制。 1. 常见Bug类型分析 在LabVIEW中&am…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...