当前位置: 首页 > 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…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

Canal环境搭建并实现和ES数据同步

作者&#xff1a;田超凡 日期&#xff1a;2025年6月7日 Canal安装&#xff0c;启动端口11111、8082&#xff1a; 安装canal-deployer服务端&#xff1a; https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…...

如何做好一份技术文档?从规划到实践的完整指南

如何做好一份技术文档&#xff1f;从规划到实践的完整指南 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...

aurora与pcie的数据高速传输

设备&#xff1a;zynq7100&#xff1b; 开发环境&#xff1a;window&#xff1b; vivado版本&#xff1a;2021.1&#xff1b; 引言 之前在前面两章已经介绍了aurora读写DDR,xdma读写ddr实验。这次我们做一个大工程&#xff0c;pc通过pcie传输给fpga&#xff0c;fpga再通过aur…...