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

【Java 进阶篇】保护你的应用:Java 过滤器实现敏感词汇过滤

在这里插入图片描述

在开发 Web 应用程序时,安全性是至关重要的一环。保护用户免受恶意内容的侵害是开发者义不容辞的责任之一。在这篇博客中,我们将深入研究如何使用 Java 过滤器来过滤敏感词汇,确保用户输入的内容不包含不良信息。我们将采用简单而实用的方法,让即使是初学者也能轻松理解。

为什么过滤敏感词汇很重要?

在用户生成内容的平台上,防范敏感词汇至关重要。这涉及到维护良好的用户体验、遵守法规以及保护用户免受侮辱和威胁。通过实施敏感词汇过滤,我们可以降低不适当内容的传播风险,提高平台的信誉度。

实现原理

我们的敏感词汇过滤器将基于一个简单的原理:在用户输入的文本中查找并替换敏感词汇。为了实现这一点,我们将创建一个 Java 过滤器,该过滤器在请求到达 Servlet 之前拦截并检查用户输入的文本。如果发现任何敏感词汇,它将进行替换或拒绝请求。

编写过滤器代码

首先,我们需要创建一个 Java 类,实现 javax.servlet.Filter 接口。以下是一个简化的例子:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/*")
public class WordFilter implements Filter {// 敏感词汇列表,可以根据需求扩展private static final String[] SENSITIVE_WORDS = {"敏感词1", "敏感词2", "敏感词3"};@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 获取用户输入的文本String userInput = request.getParameter("content");// 检查是否包含敏感词汇for (String word : SENSITIVE_WORDS) {if (userInput.contains(word)) {// 替换敏感词汇为*userInput = userInput.replaceAll(word, "*");}}// 将处理后的文本传递给下一个过滤器或 Servletchain.doFilter(new WordFilteredRequest(request, userInput), response);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 过滤器初始化操作,可留空}@Overridepublic void destroy() {// 过滤器销毁操作,可留空}
}

上述代码中,我们定义了一个 WordFilter 类,实现了 javax.servlet.Filter 接口。这个过滤器将会拦截所有请求(/* 表示匹配所有路径),获取用户输入的文本,检查是否包含敏感词汇,并进行替换。

注意到我们使用了 @WebFilter 注解,这样我们就不需要在 web.xml 文件中显式配置过滤器。

处理过滤后的请求

为了在替换敏感词后继续处理请求,我们需要创建一个自定义的 ServletRequest 类,将过滤后的文本传递给下一个过滤器或 Servlet。以下是一个简单的实现:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;public class WordFilteredRequest extends HttpServletRequestWrapper {private final String filteredContent;public WordFilteredRequest(HttpServletRequest request, String filteredContent) {super(request);this.filteredContent = filteredContent;}@Overridepublic String getParameter(String name) {// 返回过滤后的文本return "content".equals(name) ? filteredContent : super.getParameter(name);}
}

上述代码中,我们创建了一个 WordFilteredRequest 类,继承自 HttpServletRequestWrapper。这个类的目的是替换 getParameter 方法,以便返回经过过滤后的文本。

示例演示

让我们通过一个简单的示例来演示我们的敏感词汇过滤器是如何工作的。假设我们有一个简单的 Web 应用程序,用户可以提交评论,并且我们希望在评论中过滤掉敏感词汇。

1. 创建评论页面

首先,我们创建一个简单的评论页面 comment.jsp,允许用户输入评论:

<!-- comment.jsp -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Comment Page</title>
</head>
<body><form action="submitComment" method="post"><label for="comment">Your Comment:</label><br><textarea id="comment" name="content" rows="4" cols="50"></textarea><br><input type="submit" value="Submit Comment"></form>
</body>
</html>

2. 创建 Servlet 处理评论提交

然后,我们创建一个简单的 Servlet CommentServlet,用于处理评论的提交:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/submitComment")
public class CommentServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 处理评论提交String comment = request.getParameter("content");// 在实际应用中,这里可以将评论保存到数据库等操作// 返回提交成功页面response.getWriter().println("<h1>Comment Submitted Successfully!</h1>");}
}

3. 创建敏感词汇过滤器

接下来,我们创建之前提到的 WordFilter 过滤器。

4. 配置敏感词汇过滤器

在这个简单的例子中,我们使用 @WebFilter("/*") 注解,将过滤器应用于所有路径。在实际项目中,你可能需要根据实际需求配置过滤器的路径。

5. 运行和测试

最后,我们在容器中运行我们的应用程序,并访问 comment.jsp 页面。在评论中输入一些包含敏感词汇的文本,然后点击提交按钮。如果一切正常,你应该看到提交成功的页面,而敏感词汇已经被过滤掉了。

总结

通过使用 Java 过滤器,我们可以轻松地实现敏感词汇过滤的功能,以保护用户免受不良内容的侵害。在实际项目中,你可能需要根据具体情况调整和优化这个简单的实现,例如支持更复杂的敏感词汇匹配、提供用户反馈等功能。不管怎样,敏感词汇过滤是构建一个更加安全和健壮的 Web 应用程序的重要一步。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

相关文章:

【Java 进阶篇】保护你的应用:Java 过滤器实现敏感词汇过滤

在开发 Web 应用程序时&#xff0c;安全性是至关重要的一环。保护用户免受恶意内容的侵害是开发者义不容辞的责任之一。在这篇博客中&#xff0c;我们将深入研究如何使用 Java 过滤器来过滤敏感词汇&#xff0c;确保用户输入的内容不包含不良信息。我们将采用简单而实用的方法&…...

目标检测网络系列——YOLO V4

文章目录 目标检测技术总结两种优化方向Bag of freebiesBag of specialsYOLO4网络结构网络架构(architecture)的选择基础网络结构的选择网络"插件"的选择。BoF和BoS的选择(Selection of BoF and BoS)YOLO4的其他改进点对比实验不同的特征(数据增强方法)之间的对比det…...

如何在Linux上部署1Panel运维管理面板并远程访问内网进行操作

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…...

CentOS系统安装vsftpd

下载并安装vsftpd apt-get install vsftpd 安装后检查 service vsftpd status 修改配置文件(被动/匿名用户模式) vi /etc/vsftpd.conf anonymous_enableNO listenYES listen_port21 ascii_upload_enableYES ascii_download_enableYES local_enableYES guest_enable…...

手握“发展密钥”,TCL科技或迎价值重估?

在高度竞争且快速变化的泛半导体产业&#xff0c;每一次周期性或结构性的变化&#xff0c;都会对企业经营策略带来深远的影响。 2023年前三季度&#xff0c;泛半导体产业迎来结构性复苏。其中&#xff0c;主流显示领域供需关系趋向健康化&#xff0c;半导体显示行业整体上量价…...

A star算法

1. 算法的理解 1.2 a 星算法的基本的原理 a 星 是一种启发式搜索算法&#xff0c; 用于在地图中的两个目标点之间寻找最短的路径&#xff0c;它结合了最优先搜索和Dijkstra算法的特点&#xff0c;通过考虑从起点到当前点的距离&#xff08;或者代价 g&#xff08;n) ) 和估算…...

node插件MongoDB(四)—— 库mongoose 操作文档使用(新增、删除、更新、查看文档)(二)

文章目录 前言&#xff08;1&#xff09;问题&#xff1a;安装的mongoose 库版本不应该过高导致的问题&#xff08;2&#xff09;重新安装低版本 一、插入文档1. 代码2. node终端效果3. 使用mongo.exe查询数据库的内容 二、删除文档1. 删除一条2. 批量删除3. 代码 三、修改文档…...

JavaFX入门和网格布局面板的使用,Dao层交互,舞台与场景切换以及其他控件的使用

网格布局 将整个面板划分为若干个格子 , 每个格子的大小是一样的 , 每个格子中可以放置一个控件&#xff08;布局&#xff09; , 类似于表格的方式。在网格布局 中放入控件的时候 , 还需要指定位置。 GridPane gridPane new GridPane(); 我们将要排出这个布局 , 也就是登陆页…...

数据中台之数据分析

效果界面 技术方案 Notebook集成 在您的数据平台上,创建一个能够与Jupyter Notebook通讯的服务。通过Jupyter Notebook的HTTP API与Notebook实例进行交互,执行代码、获取输出等。用户界面 在数据开发/数据分析的代码框右上方,添加一个机器人样式的图标,用户点击后可以调起…...

龙芯loongarch64服务器编译安装scipy

前言 根据我之前的文章介绍,龙芯loongarch64服务器中的很多python依赖包安装有问题,发现其中安装的"scikit-learn"就无法正常使用,所有这里在 pip3 install scikit-learn -U -i https://pypi.tuna.tsinghua.edu.cn/simple 的时候发现"scipy"就无法正常…...

ubuntu(18.04)中安装open babel docker镜像并在php项目中调用容器中的obabel命令解析结果使用

使用软件&#xff1a; obabel镜像&#xff1a;informaticsmatters/obabel docker&#xff1a;http:// https://www.docker.com/ 安装docker #卸载旧版本sudo apt-get remove docker docker-engine docker-ce docker.io#更新索引包sudo apt-get update#安装 apt 依赖包&…...

02-PostgreSQL的基本使用

一、数据库操作 ①: 登录到数据库 psql -U postgres -d postgres -h 127.0.0.1②:查看所有数据库 \l③: 创建数据库 # 创建一个名为 mydb 的数据库 create database mydb;④:切换数据库 # \c 数据库名 \c mydb⑤:删除数据库 # 删除前 先确保数据库没有被连接 drop databa…...

uniapp 实现路线规划

UniApp是一个跨平台的应用开发框架&#xff0c;可以帮助开发者快速地在多个平台上构建应用程序。其中&#xff0c;实现路线规划是一个常见的需求&#xff0c;特别是对于地图类应用或者出行类应用来说&#xff0c;路线规划功能是非常重要的。 首先引入QQMapWX&#xff1b; impo…...

C语言C位出道心法(五):内存管理

C语言C位出道心法(一):基础语法 C语言C位出道心法(二):结构体|结构体指针|链表 C语言C位出道心法(三):共用体|枚举 C语言C位出道心法(四):文件操作 C语言C位出道心法(五):内存管理 一:C语言内存管理认知 二:C语言中内存堆|栈认知 三:C语言中引用内存丢失认知...

Flink之SQL客户端与DDL操作

SQL客户端与DDL操作 Flink SQLSQL客户端1.启动Flink2.启动Flink的SQL客户端3.HELP命令4.验证连接5.结果显示模式6.执行配置 数据库操作1.创建数据库2.查询数据库3.修改数据库4.删除数据库 表操作1.创建表表列属性表Watermark属性列PRIMARY KEY属性列PARTITIONED BY属性列WITH选…...

记录第一次银行测试岗面试【总结几点面试不要犯得错误】

LZ在一个18线小城市做测试&#xff0c;近来想走出自己的舒适区&#xff0c;去做一点不一样的测试工作。 18线地区&#xff0c;测试工作并不多。最好的差不多就是LZ目前待着的公司了。遂决定去魔都闯荡几年&#xff0c;对一个在魔都无房无车无户口的人来讲&#xff0c;这意味着…...

一篇带你精通php

华子目录 什么是phpphp发展史平台支持和数据库支持网站静态网站和动态网站的区别静态网站动态网站的特点 关键名词解析服务器概念IP的概念域名DNS端口 web程序的访问流程静态网站访问流程动态网站访问流程 php标记脚本标记标准标记&#xff08;常用&#xff09; php注释 什么是…...

Go 语言函数

文章目录 Go 语言函数1. **函数的定义**&#xff1a;2. **参数和返回值**&#xff1a;3. **函数调用**&#xff1a;4. **多返回值**&#xff1a;5. **匿名函数**&#xff1a;6. **函数作为值**&#xff1a;7. **变参函数**&#xff1a;8. **递归函数**&#xff1a;9. **函数方法…...

前端小技巧: 拍平数组的6种常见方法

关于数组拍平 所谓数组拍平&#xff0c;就是按照顺序&#xff0c;把他们全放在一个数组中需要考虑多层级和嵌套的问题来彻底拍平数组 * 实现方案 1 &#xff09;一般思路, 先实现一级扁平化&#xff0c;然后递归&#xff0c;直到全部扁平 function flat(arr) {const res […...

c++day6

#include <iostream>using namespace std; class Animal { public:virtual void peform() 0; }; class Monekey:public Animal { public:void peform(){cout << "猴子黑桃A" << endl;} }; class Elepthant:public Animal {void peform(){cout &l…...

NVIDIA Llama Nemotron Ultra:开源推理模型的技术突破与应用

1. NVIDIA Llama Nemotron Ultra&#xff1a;重新定义开源推理模型的新标杆作为一名长期关注AI技术发展的从业者&#xff0c;我最近深度测试了NVIDIA最新发布的Llama Nemotron Ultra模型。这款开源推理模型在科学推理、编程和数学三大领域的表现确实令人惊艳&#xff0c;特别是…...

告别卡顿!用FFmpeg的GPU硬解码加速你的视频处理流程(NVIDIA CUDA实测)

告别卡顿&#xff01;用FFmpeg的GPU硬解码加速你的视频处理流程&#xff08;NVIDIA CUDA实测&#xff09; 视频处理工作流中&#xff0c;最令人头疼的莫过于漫长的转码等待时间。当你的4K素材在时间线上预览卡顿&#xff0c;或是批量转码任务让CPU占用率飙升到100%时&#xff0…...

如何应对频繁变化的需求:提高测试用例编写与执行的实用性

在软件开发中&#xff0c;需求的频繁变化很多时候成了常态。尽管这种变化有助于确保最终产品更符合用户需求&#xff0c;但对于质量保证&#xff08;QA&#xff09;团队来说&#xff0c;这也带来了巨大的挑战。下面&#xff0c;我们通过一个具体案例&#xff0c;探讨如何改进测…...

从ProcessBuilder源码看Java进程创建:如何优雅地处理I/O流与子进程?

Java进程交互的深度实践&#xff1a;从ProcessBuilder源码到高效流处理 在分布式系统与自动化工具链开发中&#xff0c;Java进程管理能力直接影响着系统稳定性和资源利用率。当我们使用Runtime.getRuntime().exec()执行一个简单的ls命令时&#xff0c;背后究竟发生了多少层级的…...

废旧元件DIY太阳能光控LED灯串设计

1. 项目概述这个用废旧零件拼凑起来的模拟电路项目&#xff0c;完美诠释了"变废为宝"的DIY精神。它由太阳能板、锂电池和几颗白光LED组成&#xff0c;打造出了一串既环保又充满魅力的装饰灯串。在这个被各种专用芯片和微控制器统治的时代&#xff0c;这个项目提醒我们…...

从调光到伽马校正:手把手教你用ILI9341命令优化TFT屏幕显示效果(实战避坑)

从调光到伽马校正&#xff1a;手把手教你用ILI9341命令优化TFT屏幕显示效果&#xff08;实战避坑&#xff09; 在嵌入式开发中&#xff0c;TFT屏幕的显示效果往往直接影响用户体验。许多开发者在使用ILI9341驱动芯片时&#xff0c;虽然能够完成基础显示功能&#xff0c;却常常忽…...

从芯片选型到实测优化:你的GNSS模块TTFF总超40秒?可能是这5个坑没避开

从芯片选型到实测优化&#xff1a;GNSS模块TTFF超40秒的5个关键陷阱与解决方案 当你在城市峡谷中焦急等待共享单车解锁&#xff0c;或是物流追踪系统因定位延迟而丢失货物轨迹时&#xff0c;GNSS模块的首次定位时间&#xff08;TTFF&#xff09;直接决定了用户体验和商业价值。…...

别再乱买随身WiFi了!手把手教你用手机App(Cellular-Z)查清本地运营商频段,精准避坑

手机秒变信号探测器&#xff1a;3步教你用Cellular-Z避开随身WiFi选购雷区 每次看到电商平台上那些标榜"全网通"的随身WiFi设备&#xff0c;总忍不住想问&#xff1a;它们真的能在你家客厅稳定上网吗&#xff1f;去年我表弟就踩过这个坑——花500多买的"全频段支…...

PyTorch实战:用膨胀卷积替换池化层,保持特征图尺寸提升分割精度

PyTorch实战&#xff1a;用膨胀卷积替换池化层提升分割精度的工程实践 当你在深夜调试一个医学影像分割模型时&#xff0c;可能会遇到这样的困境&#xff1a;显微镜下的细胞边缘总是被预测成模糊的色块&#xff0c;而肿瘤区域的细小突起在多次下采样后彻底消失在特征图里。这时…...

Spring Boot 4.0 Agent-Ready架构的7个隐性成本黑洞(92%团队在第4步已超支)

第一章&#xff1a;Spring Boot 4.0 Agent-Ready架构的成本认知重构Spring Boot 4.0 将 JVM Agent 集成能力从“可选插件”升级为一等公民&#xff0c;其核心在于重新定义可观测性、安全加固与运行时治理的资源开销边界。传统上&#xff0c;字节码增强&#xff08;如 OpenTelem…...