Servlet规范中定义的过滤器

文章目录

  • 什么是过滤器
  • 写过滤器的步骤
  • 配置初始化参数
  • 过滤器的优先级
  • 过滤器的优点
  • 过滤器执行过程图解
  • 过滤敏感词的示例代码
    • 使用 Servlet 来过滤敏感词
    • 使用过滤器来过滤敏感词
    • 通过配置初始化参数来设置敏感词
  • 关于 web.xml 的配置

什么是过滤器

Servlet 规范当中定义的一种特殊的类,用于对 Servlet 容器的调用过程进行拦截。

写过滤器的步骤

step1
写一个 java 类,实现一个 Filter 接口。
step2
在 doFilter 方法里,实现过滤的逻辑。
step3
配置(web.xml)。

配置初始化参数

step1
web.xml 中,使用 <init-para> 元素来配置初始化参数
step2
在 Filter 类中,使用 FilterConfig.getInitParameter(String paraName); 获得初始化参数。

过滤器的优先级

当有多个过滤器都满足过滤的条件时,依据 <filter-mapping> 的先后顺序依次执行。

过滤器的优点

a. 可以将多个 web 组件相同的逻辑写在一个过滤器当中,方便代码的维护
b. 可实现代码的“可插拔性"。
给一个软件增加戒者减少某个功能不会影响已经存在的功能。

过滤器执行过程图解

在这里插入图片描述

  1. 浏览器发送请求给服务器
  2. 服务器的 Servlet 引擎创建 Request 对象&&Response 对象
  3. Servlet 引擎先调用过滤器的 doFilter 方法,该方法有两个参数 request 和 response,
    (在过滤器中可以访问到 Request 对象&&Response 对象)
  4. 过滤器对拦截的内容迚行处理
  5. 之后调用 SomeServlet 的 service 方法
  6. service 方法执行
  7. service 方法执行结束后,将结果返回到过滤器
  8. 过滤器将 service 方法返回的结果再次进行过滤
  9. 最后,Servlet 引擎将结果返回给浏览器

过滤敏感词的示例代码

使用 Servlet 来过滤敏感词

实现敏感词过滤功能,如果没有使用过滤器,我们使用 Servlet 来实现。

JSP 页面代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body style="font-size: 30px;">
<form action="process" method="post">input your comment:<input type="text" name="comment"/><input type="submit" value="提交"/>
</form>
</body>
</html>

Servlet 代码:

package priv.lwx.servlet.filter.web;import org.junit.jupiter.api.Test;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;
import java.io.PrintWriter;/*** description** @author liaowenxiong* @date 2022/2/23 22:40*/
@WebServlet("/process")
public class ProcessServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();String comment = req.getParameter("comment");if (comment.indexOf("dog") >= 0) {out.println("含有违禁关键字");} else {out.println("你的评论是:" + comment);}out.close();}@Testpublic void test() {System.out.println("dog".indexOf("dog"));}
}

使用过滤器来过滤敏感词

Filter 的代码如下:

package priv.lwx.servlet.filter;
/*** 评论敏感词过滤器** @author liaowenxiong* @date 2022/2/23 23:14*/import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.io.PrintWriter;@WebFilter("/process")
public class CommentFilter implements Filter {/*** Servlet 容器在创建好 Filter 实例之后,会立即创建* FilterConfig 实例并调用 init()方法,将 FilterConfig* 实例作为参数传递过去。通过该实例,可以访问 Filter 的初始化参数。* String FilterConfig.getInitParameter(String paraName);* init()方法只会执行一次。** @param config* @throws ServletException*/public void init(FilterConfig config) throws ServletException {System.out.println("init...");}/*** 在容器删除Filter实例之前,调用该方法。* 只会执行一次。*/public void destroy() {System.out.println("destroy...");}/*** 当请求到达容器,容器会调用 doFilter 方法。* 容器会将事先创建好的 request,response 对象作为* 参数传递过去。* FilterChain:过滤器链。* 如果调用了 FilterChain.doFilter 方法,表示调用* 后续的过滤器。如果没有过滤器了,则调用对应的 web 组件。** @param request* @param response* @param chain* @throws ServletException* @throws IOException*/@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {request.setCharacterEncoding("utf8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();String comment = request.getParameter("comment");if (comment.indexOf("dog") >= 0) {out.println("评论中含有敏感词!");} else {// 调用后续的过滤器,如果没有了,则调用Web组件chain.doFilter(request, response);}}}

注意点:过滤器的请求路径(即url-pattern)必须与web组件(Servlet)的url-pattern相同。

Servlet 的代码如下:

package priv.lwx.servlet.filter.web;import org.junit.jupiter.api.Test;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;
import java.io.PrintWriter;/*** description** @author liaowenxiong* @date 2022/2/23 22:40*/
@WebServlet("/process")
public class ProcessServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();String comment = req.getParameter("comment");out.println("你的评论是:" + comment);out.close();}@Testpublic void test() {System.out.println("dog".indexOf("dog"));}
}

通过配置初始化参数来设置敏感词

Filter 的示例代码:

package priv.lwx.servlet.filter;
/*** 评论敏感词过滤器** @author liaowenxiong* @date 2022/2/23 23:14*/import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;@WebFilter(value = "/process", initParams = {@WebInitParam(name = "illegalStr0",value = "dog"), @WebInitParam(name = "illegalStr1", value = "pig")})
public class CommentFilter implements Filter {private FilterConfig config;/*** Servlet 容器在创建好 Filter 实例之后,会立即创建* FilterConfig 实例并调用 init()方法,将 FilterConfig* 实例作为参数传递过去。通过该实例,可以访问 Filter 的初始化参数。* String FilterConfig.getInitParameter(String paraName);* init()方法只会执行一次。** @param config* @throws ServletException*/public void init(FilterConfig config) throws ServletException {System.out.println("init...");config = config;}/*** 在容器删除Filter实例之前,调用该方法。* 只会执行一次。*/public void destroy() {System.out.println("destroy...");}/*** 当请求到达容器,容器会调用 doFilter 方法。* 容器会将事先创建好的 request,response 对象作为* 参数传递过去。* FilterChain:过滤器链。* 如果调用了 FilterChain.doFilter 方法,表示调用* 后续的过滤器。如果没有过滤器了,则调用对应的 web 组件。** @param request* @param response* @param chain* @throws ServletException* @throws IOException*/@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {request.setCharacterEncoding("utf8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();String comment = request.getParameter("comment");Enumeration<String> initParameterNames = config.getInitParameterNames();// 是否含有敏感词,默认无boolean isIllegal = false;while (initParameterNames.hasMoreElements()) {String initParameterName = initParameterNames.nextElement();String initParameter = config.getInitParameter(initParameterName);if (comment.indexOf(initParameter) >= 0) {// 含有敏感词isIllegal = true;out.println("评论中含有敏感词:" + initParameter);break;}}if (!isIllegal) {// 没有敏感词,则调用后续的过滤器,如果没有过滤器,则调用Web组件chain.doFilter(request, response);}}}

注意点:注解 WebFilter 的 属性 initParams,其值是一个注解数组,即数组元素的类型就是 @WebInitParam,或者说数组元素是 @WebInitParam 的实例对象。

赋值示例代码如下:

initParams = {@WebInitParam(name = "illegalStr0",value = "dog"), @WebInitParam(name = "illegalStr1", value = "pig")}

解读:
注解 WebInitParam 用来封装参数,方法 initParams 用来从 WebInitParam 对象获取参数,再将参数封装到 Request 对象中。

Servlet 的示例代码:

package priv.lwx.servlet.filter.web;import org.junit.jupiter.api.Test;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;
import java.io.PrintWriter;/*** description** @author liaowenxiong* @date 2022/2/23 22:40*/
@WebServlet("/process")
public class ProcessServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();String comment = req.getParameter("comment");out.println("你的评论是:" + comment);out.close();}@Testpublic void test() {System.out.println("dog".indexOf("dog"));}
}

关于 web.xml 的配置

上面的示例并没有在 web.xml 文件中对 Servlet、Filter 进行配置,采用的都是注解配置。如果要在 web.xml 配置 Servlet、Filter 请参考下面的配置内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><filter><filter-name>filter1</filter-name><filter-class>priv.lwx.servlet.filter.CommentFilter</filter-class><init-param><param-name>illegalStr0</param-name><param-value>dog</param-value></init-param><init-param><param-name>illegalStr1</param-name><param-value>pig</param-value></init-param></filter><filter-mapping><filter-name>filter1</filter-name><url-pattern>/process</url-pattern></filter-mapping><servlet><servlet-name>process</servlet-name><servlet-class>priv.lwx.servlet.filter.web.ProcessServlet</servlet-class></servlet><servlet-mapping><servlet-name>process</servlet-name><url-pattern>/process</url-pattern></servlet-mapping>
</web-app>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot错误–创建在类路径资源DataSourceAutoConfiguration中定义的名称为“ dataSource”的bean时出错...

大家好&#xff0c;如果您使用的是Spring Boot&#xff0c;并且遇到诸如“无法为数据库类型NONE确定嵌入式数据库驱动程序类”或“在类路径资源ataSourceAutoConfiguration中定义的名称为dataSource的bean创建错误”之类的错误&#xff0c;那么您来对地方了地点。 在本文中&…

simulink怎么生成vxworks的执行程序_从EPB模型谈谈Simulink代码生成

前段时间有读者朋友问代码生成的例子&#xff0c;说他正在做EPB的仿真模型&#xff0c;但总是和应用串不到一块去&#xff0c;我这里就从一个简单EPB控制模型来谈谈simulink代码生成&#xff0c;总结代码生成方法的同时也顺便回答他的问题。1.EPB模型准备用来举例说明的模型很简…

通过Socket实现文件上传/上传文件

文章目录整个功能的实现步骤客户端的实现步骤服务端的实现步骤示例代码整个功能的实现步骤 1.客户端使用本地的字节输入流读取被上传的文件数据 2.客户端使用网络字节输出流&#xff0c;将读取到的文件数据发送给服务端 3.服务端使用网络字节输入流读取客户端发送过来的文件数…

构造函数调用默认构造函数_显式无参数构造函数与默认构造函数

构造函数调用默认构造函数大多数不熟悉Java的开发人员都会Swift了解到&#xff0c;如果他们没有指定至少一个显式构造函数&#xff0c;则会为Java类隐式创建一个“ 默认构造函数 ”&#xff08; 由javac进行创建&#xff09;。 Java语言规范的 8.8.9节简要指出&#xff1a;“如…

Artifact到底是什么

将项目构建成一个可以在服务器部署的文件包&#xff08;如&#xff1a;war 包或者 exploded 的文件包&#xff09;&#xff0c;或者构建成的 jar 包&#xff08;这些 jar 包通常是某些模块程序文件&#xff0c;也可以是某些插件程序文件&#xff09;&#xff0c;这些都叫 Artif…

python win10 桌面_Python3如何实现Win10桌面自动切换

得空写了个自动切换桌面背景图片的小程序。再不写python就要扔键盘了&#xff0c;对vue还有那么一点好感&#xff0c;天天php真是有够烦。准备工作准备个文件夹放在桌面上&#xff0c;平时看到什么高清好图就拽进去。运行脚本脚本如下&#xff1a;#!/usr/bin/pythonimport ctyp…

java中抽象类继承抽象类_用Java中的抽象类扩展抽象类

java中抽象类继承抽象类示例问题 当我创建Java :: Geci抽象类AbstractFieldsGenerator和AbstractFilteredFieldsGenerator我遇到了一个不太复杂的设计问题。 我想强调一下&#xff0c;这个问题和设计对于某些人来说似乎很明显&#xff0c;但是在我最近与一位初级开发人员&#…

pb90代码如何连接sql2008r2_如何使用 HTTP Headers 来保护你的 Web 应用

众所周知&#xff0c;无论是简单的小网页还是复杂的单页应用&#xff0c;Web 应用都是网络攻击的目标。2016 年&#xff0c;这种最主要的攻击模式 —— 攻击 web 应用&#xff0c;造成了大约 40% 的数据泄露。事实上&#xff0c;现在来说&#xff0c;了解网络安全并不是锦上添花…

Servlet配置初始化参数/配置参数

文章目录给某个Servlet配置初始化参数配置全局的参数ServletConfig给某个Servlet配置初始化参数 也可以通过注解的方式来配置初始化参数&#xff1a; 在 Servlet 中获取针对 Servlet 的参数值&#xff1a; String version getInitParameter("version");配置全局的…

poi动态创建文档_POI创建的文档具有不同条件的灵活样式

poi动态创建文档介绍 这篇文章解释了基于各种标准将样式应用于文档的困难并提供了解决方案。 Java编程中的常见任务之一是根据存储在数据库中的数据创建Excel报告。 在这些情况下&#xff0c;Java程序员使用POI :-)。 这些报告通常对样式和数据格式有严格的规定。 数据通常是SQ…

python编码程序_python 编码

网页的编码方式是简体中文gb2312 (查看网页源码&#xff0c;可以看到)&#xff0c;而python内部的编码方式为unicode&#xff0c;之前的代码是这样的&#xff1a;contentAll urllib.urlopen(urlLink).read()soup BeautifulSoup.BeautifulSoup(contentAll) #生成BeautifulSou…

比特(bit)_二进制数

二进制数位&#xff0c;也叫比特位&#xff0c;其实就是指位置&#xff0c;是指二进制数的位置。例如&#xff0c;0101 这是二进制数&#xff0c;而且是 4 位的二进制数&#xff0c;因为有 4 个位置&#xff0c;每个位置放一个二进制数&#xff0c;确切的说是每个位置放一个二进…

javax线程池超时结束_没有Javax的Jakarta EE:这次世界也不会结束

javax线程池超时结束如果您错过了新闻&#xff0c; Oracle将向Eclipse基金会捐赠Java EE规范 。 这个决定是在规范过程中进行了相当长时间的Hibernate之后&#xff0c;人们理所当然地怀疑Oracle丧失了对Java EE的战略兴趣。 首先&#xff0c;Java EE和更广泛的Java社区很好地满…

Final Cut Pro X如何去视频水印/视频去水印

先剪辑好视频(比如把不要的段切掉)&#xff0c;然后选中视频&#xff0c;把它复制一份到另一个轨道(按住option键&#xff0c;用鼠标左键拖放即可复制)点击右下角的 效果(Effect)→ 模糊(Blur)→ 高斯模糊(Gaussian)&#xff0c;把高斯模糊拖入上边那条轨道再次选择效果(Effect…

为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...

我还记得大学实习面试时&#xff0c;被问到什么是线程池这个问题&#xff0c;因为这个题我被录取了&#xff0c;原因就是我背出来了&#xff0c;而另外一个面试的没背出来&#xff0c;说实话当时还真不知道它是干什么的&#xff0c;就是看面试题给背下来了&#xff0c;在之后就…

java中两任务并行运行_Java并行编程中的“可调用”与“可运行”任务

java中两任务并行运行当我们用Java编写多线程应用程序时&#xff0c;我们倾向于使用“ Runnable ”接口来实现线程类。 您的类必须简单地实现此接口并覆盖run方法。 对于琐碎的用例&#xff0c;我们可以通过调用“ start”方法直接启动线程&#xff0c;结果将控制流委托给run…

Servlet中的监听器

文章目录什么是监听器如何写监听器配置监听器统计在线人数的案例什么是监听器 Servlet 规范当中定义的一种特殊的类&#xff0c;作用是监听容器当中产生的一些事件并进行相应的处理。 容器产生的事件指的是两大类事件&#xff1a; 第一大类 生命周期相关的事件&#xff0c;指…

python调用百度接口实现ocr识别_Python调用百度OCR实现图片文字识别的示例代码

百度AI提供了一天50000次的免费文字识别额度&#xff0c;可以愉快的免费使用&#xff01;下面直接上方法&#xff1a;首先在百度AI创建一个应用&#xff0c;按照下图创建即可&#xff0c;创建后会获得如下&#xff1a;创建后会获得如下信息&#xff1a;APP_ID ******API_KEY …

selenium 替代品_每个人都在谈论Selenium替代品-明智地选择!

selenium 替代品什么是Selenium&#xff1f; Selenium是一套Web浏览器自动化工具&#xff0c;用于跨多种平台实现浏览器自动化。 尽管Selenium工具具有更多功能&#xff0c;但出于测试原因&#xff0c;它们仍被用来自动化Web应用程序。 Jason Huggins于2004年创建了Selenium&am…

Maven构建Artifact时,不会创建空目录

Maven 构建的 Web 项目中&#xff0c;你在 Web Resource Directories&#xff08;默认名称是webapp&#xff09;下创建的空目录&#xff0c;在构建Artifact 时&#xff0c;并不会在构件中也创建该空目录。 下图所示的四个空目录 upload&#xff0c;在构建 Artifact 时都不会创…