JavaEE之Filter过滤器、登录状态验证、敏感词汇过滤

article/2025/9/30 22:46:57

Filter:过滤器

1. 概念:

生活中的过滤器:净水器,空气净化器web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
过滤器的作用:一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤...

2. 快速入门:

1. 步骤:

		1. 定义一个类,实现接口Filter2. 复写方法3. 配置拦截路径1. web.xml2. 注解

2. 代码:

@WebFilter("/*")//访问所有资源之前,都会执行该过滤器
public class FilterDemo1 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filterDemo1被执行了....");//放行filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {}
}

3. 过滤器细节:

1. web.xml配置

			<filter><filter-name>demo1</filter-name><filter-class>cn.itcast.web.filter.FilterDemo1</filter-class></filter><filter-mapping><filter-name>demo1</filter-name><!-- 拦截路径 --><url-pattern>/*</url-pattern></filter-mapping>

2. 过滤器执行流程

		1. 执行过滤器2. 执行放行后的资源3. 回来执行过滤器放行代码下边的代码

3. 过滤器生命周期方法

		1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源2. doFilter:每一次请求被拦截资源时,会执行。执行多次3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源

@WebFilter("/*")
public class FilterDemo3 implements Filter {/*** 每一次请求被拦截资源时,会执行。执行多次* @param req* @param resp* @param chain* @throws ServletException* @throws IOException*/public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {System.out.println("doFilter....");chain.doFilter(req, resp);}/*** 在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源* @param config* @throws ServletException*/public void init(FilterConfig config) throws ServletException {System.out.println("init....");}/*** 在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源*/public void destroy() {System.out.println("destroy....");}}

启动服务器时会自动执行init方法,并且只执行一次
在这里插入图片描述
启动完服务器后,浏览器多次发起请求时,会执行doFilter方法
在这里插入图片描述

4. 过滤器配置详解

拦截路径配置:
1. 具体资源路径: /index.jsp   只有访问index.jsp资源时,过滤器才会被执行
2. 拦截目录: /user/*	访问/user下的所有资源时, 过滤器都会被执行
3. 后缀名拦截: *.jsp		访问所有后缀名为jsp资源时,过滤器都会被执行
4. 拦截所有资源:/*		访问所有资源时,过滤器都会被执行
拦截方式配置:资源被访问的方式
注解配置:设置dispatcherTypes属性1. REQUEST:默认值。浏览器直接请求资源2. FORWARD:转发访问资源3. INCLUDE:包含访问资源4. ERROR:错误跳转资源5. ASYNC:异步访问资源
//浏览器直接请求index.jsp资源时,该过滤器会被执行
@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
//只有转发访问index.jsp时,该过滤器才会被执行
@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.FORWARD)
//浏览器直接请求index.jsp或者转发访问index.jsp。该过滤器才会被执行
@WebFilter(value="/*",dispatcherTypes ={ DispatcherType.FORWARD,DispatcherType.REQUEST})
web.xml配置设置<dispatcher></dispatcher>标签即可

5. 过滤器链(配置多个过滤器)

		* 执行顺序:如果有两个过滤器:过滤器1和过滤器21. 过滤器12. 过滤器23. 资源执行4. 过滤器25. 过滤器1 * 过滤器先后顺序问题:1. 注解配置:按照类名的字符串比较规则比较,值小的先执行* 如: AFilter 和 BFilter,AFilter就先执行了。2. web.xml配置: <filter-mapping>谁定义在上边,谁先执行

4. 案例:

案例1_登录验证

 需求:1. 访问day17_case案例的资源。验证其是否登录2. 如果登录了,则直接放行。3. 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。

@WebFilter(filterName = "LoginFilter")
public class LoginFilter implements Filter {public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//0. 强制转换HttpServletRequest request = (HttpServletRequest) req;//1. 获取资源请求路径String uri = request.getRequestURI();//2. 判断是否包含登陆相关资源路径if (uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/js/") || uri.contains("/css/") || 1uri.contains("/fonts/") || uri.contains("/checkServlet")){// 包含,发起请求的是登陆界面,放行chain.doFilter(req,resp);}else{// 不包含,需要验证用户是否登录//3. 从获取session中获取userObject user = request.getSession().getAttribute("user");if (user!=null){chain.doFilter(req,resp);}else {// 没有登录,跳转登陆界面request.setAttribute("login_msg", "您未登录,请登录");request.getRequestDispatcher("/login.jsp").forward(request, resp);}}}public void init(FilterConfig config) throws ServletException {}public void destroy() {}
}

案例2_敏感词汇过滤

 需求:1. 对day17_case案例录入的数据进行敏感词汇过滤2. 敏感词汇参考《敏感词汇.txt》3. 如果是敏感词汇,替换为 *** * 分析:1. 对request对象进行增强。增强获取参数相关方法2. 放行。传递代理对象* 增强对象的功能:* 设计模式:一些通用的解决固定问题的方式1. 装饰模式2. 代理模式* 概念:1. 真实对象:被代理的对象2. 代理对象:3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的* 实现方式:1. 静态代理:有一个类文件描述代理模式2. 动态代理:在内存中形成代理类* 实现步骤:1. 代理对象和真实对象实现相同的接口2. 代理对象 = Proxy.newProxyInstance();3. 使用代理对象调用方法。4. 增强方法* 增强方式:1. 增强参数列表2. 增强返回值类型3. 增强方法体执行逻辑	
package cn.itcast.web.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;@WebFilter("/SensitiveWordsFilter")
public class SensitiveWordsFilter implements Filter {public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {// 创建代理对象,增强getParameter方法ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 增强个体Parameter方法// 判断是否是getParameter方法if (method.getName().equals("getParameter")){// 增强返回值// 获取返回值String value = (String) method.invoke(req, args);if (value!=null){for (String str:list){if (value.contains(str)){value = value.replaceAll(str, "****");}}}}return null;}});chain.doFilter(proxy_req, resp);}private List<String> list = new ArrayList<>();public void init(FilterConfig config) throws ServletException {try {// 加载文件ServletContext servletContext = config.getServletContext();String realPath = servletContext.getRealPath("WEB-INF/classes/敏感词汇.txt");// 读取文件BufferedReader br = new BufferedReader(new FileReader(realPath));// 将文件中的每一行数据加载到list中String line = null;while((line=br.readLine())!=null){list.add(line);}br.close();System.out.println(list);}catch (Exception e){System.out.println(e.getStackTrace());}}public void destroy() {}
}

http://chatgpt.dhexx.cn/article/ov7w8jmx.shtml

相关文章

SpringBoot项目实现敏感词汇过滤

记录背景&#xff1a;SpringBoot项目实现敏感词汇过滤 一&#xff1a;敏感词汇文件放置位置 二&#xff1a;说明&#xff1a;如果txt文件不能编译&#xff0c;pom文件添加下面配置 <build><resources><resource><directory>src/main/resources</…

敏感词过滤的php代码,ThinkPHP敏感词汇过滤

如果内容中包含敏感词汇&#xff0c;则返回False&#xff0c;否则返回True。 很简单的代码。 请将文件放置于 "项目/ORG/SensitiveFilter.class.php"下。 其中 “ SensitiveThesaurus.php”是一个敏感词汇数组&#xff0c;大家可以任意添加内容。 1.[代码][PHP]代码&…

JavaWeb 敏感词汇过滤器

1&#xff0c;基本功能 在提交数据时&#xff0c;常常需要检查数据中是否含有敏感词汇&#xff0c;有的话&#xff0c;需要屏蔽敏感词汇 2&#xff0c;实现原理 我们可以使用Filter过滤器&#xff0c;对数据进行检查与处理&#xff0c;将处理完毕的数据放行。因此&#xff0c;…

Filter 敏感词汇过滤案例

文章目录 一、需求分析二、案例实现 一、需求分析 &#xff08;1&#xff09;对案例录入的数据进行敏感词汇过滤 &#xff08;2&#xff09;敏感词汇参考敏感词汇.txt &#xff08;3&#xff09;如果是敏感词汇&#xff0c;替换为 *** 可以确定 Filter 和 servlet 中的 reques…

5分钟搞定敏感词过滤!

函数工作流(FunctionGraph,FGS)是一项基于事件驱动的函数托管计算服务,托管函数具备以毫秒级弹性伸缩、免运维、高可靠的方式运行。通过函数工作流,开发者无需配置和管理服务器,只需关注业务逻辑,编写函数代码,以无服务器的方式构建应用,便能开发出一个弹性高可用的后…

基础编程题目集 7-32 说反话-加强版 (20分)

#include <stdio.h> //标准c&#xff0c;没有用c的string&#xff0c;这样首先读取字符串就是个问题了 #define MAX 500000 //先处理字符串&#xff0c;删除多余的空格&#xff0c;形成新字符串 //Hello World Here I Come int main() {char s; //指单独一个字符c…

PTA 7-32 说反话-加强版

思路&#xff1a; 读入字符串str&#xff0c;那么用output数组存储每个单词的首字母&#xff0c;及尾字母后一字母在字符串的下标。那么已知这两个数据便可以输出该单词。 考虑到逆序输出的需要&#xff0c;逆序读取字符串。 如字符串”#apple##“&#xff08;#表示空格&#…

C++ 1009 说反话(20 分)

注意点1:转载自:https://blog.csdn.net/u011421608/article/details/44591579 我们先来看一段输入流cin>>和getline混用的代码: #include<iostream> #include<string> using namespace std;int main() {int age;string name;cout<<"请输入年…

7-32 说反话-加强版

7-32 说反话-加强版&#xff08;20 分&#xff09; 给定一句英语&#xff0c;要求你编写程序&#xff0c;将句中所有单词的顺序颠倒输出。 输入格式&#xff1a; 测试输入包含一个测试用例&#xff0c;在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成…

Sql Server char nchar varchar nvarchar 区别

一、 用快捷键AltF1 打开的表结构&#xff0c; 我们看到的length, nchar和nvarchar 需要除以2才是储存的真正长度 二 、 类型前缀的意思1.有var前缀的&#xff0c;表示是实际存储空间是变长的&#xff0c;varchar,nvarchar 所谓定长就是长度固定的&#xff0c;当输入的数据长度…

Sqlserver 中nchar(n)、varchar(n)、nvarchar(n)和nvarchar(max)的区别

nchar(n): 固定大小字符串数据。 n 用于定义字符串大小&#xff08;以双字节为单位&#xff09;&#xff0c;并且它必须是 1 到 4,000 之间的值。 存储大小为 n 字节的两倍。 varchar(n): 长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间…

通过实战探索数据库中的char、varchar、varchar2、nvarchar2的部分区别

前言 注&#xff1a;本文的实践是在oracle数据库中进行的&#xff0c;主要基于字节与字符以及定长与变长方面考虑&#xff0c;探索这四个类型的部分区别 Oracle数据库中&#xff0c;char、varchar、varchar2、nvarchar2是我们常用到的数据类型 &#xff08;MySQL中没有varch…

nvarchar 和varchar区别

有时候设计字段的时候&#xff0c;碰到nvarchar和varchar时候&#xff0c;是有点犹豫。所以今天就来探个究竟把。 (一) varchar是非Unicode可变长度类型&#xff0c;nvarchar是Unicode编码可变长度类型 DECLARE name AS VARCHAR(50)我是中国人test SELECT name AS Name, DATAL…

oracle NVARCHAR2 数据类型

参考地址 https://docs.oracle.com/cd/B19306_01/server.102/b14225/ch7progrunicode.htm#sthref807 英语不好的看中文直译 utf8可能会影响性能&#xff0c;因为它是一个可变宽度字符集。NChar字段的空白填充过多会降低性能。考虑使用nvarchar数据类型或更改为nchar数据类型的a…

【ORACLE】谈一谈NVARCHAR2、NCHAR、NCLOB等数据类型和国家字符集

一、背景 一直以来&#xff0c;很多用过ORACLE数据库的开发人员&#xff0c;都知道在ORACLE中&#xff0c;字符类型可以为varchar2&#xff0c;也可以为nvarchar2&#xff0c;但是很多人都不知道这两种类型有什么区别&#xff0c;同样还有char/nchar,clob/nclob这些&#xff0…

Oracle NCHAR与NVARCHAR2 最大字符数和最大字节数

根据官方文档和实验测试整理一下常见问题以及相关结论&#xff0c;以NVARCHAR2为主。 一、 含义及用途 NCHAR和NVARCHAR2都是Unicode数据类型&#xff0c;存储Unicode字符数据。NCHAR和NVARCHAR2数据类型的对应的国家字符集&#xff08;NLS_NCHAR_CHARACTERSET&#xff09;只能…

foreach 中如何给数组赋值

最近发现&#xff0c;在foreach中给数组赋值&#xff0c;在foreach外&#xff0c;数组是没有变化的&#xff0c;对此情况&#xff0c;有特定的处理方法&#xff0c;特此记录一下&#xff1a; 如下&#xff0c;就是在foreach中&#xff0c;加上 $res[$k] $v;给$res重新赋值&am…

数组与数组赋值

int类型数组赋值 #include<stdio.h> int main() { int a[] {1,2,3,4,5,7}; printf("a[3]%d", a[3]); return 0; } char类型数组赋值 1.直接字符串赋值 char a[] "q,0/d"; 2.逐个赋值 char b[] { d,b,3,&am…

VBA 不能给数组赋值,其实只是不能给静态数组整体赋值

1 问题&#xff1a;VBA报错&#xff1a;不能给数组赋值&#xff01; 其实并不是 所有数组不能赋值其实是不能给静态数组&#xff0c;整体赋值&#xff01;只是因为当前处理的是一个静态数组 2 什么是静态数组 &#xff08;只是大小静态&#xff01;&#xff01; 赋值可变&…

天呐!java从键盘给数组赋值

开头 该文档在Github上收获5K+star的Java核心神技(这参数,质量多高就不用我多说了吧)非常全面,包含基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等内容非常丰富…