🎄欢迎来到@边境矢梦°的csdn博文,本文主要讲解Java 中三大组件之过滤器 Filter的相关知识🎄
🎆喜欢的朋友可以关注一下🫰🫰🫰,下次更新不迷路🎆
Ps: 月亮越亮说明知识点越重要 (重要性或者难度越大)🌑🌒🌓🌔🌕
目录
🌕[前言 :](#前言 :)
🌔[一. 问题引出](#一. 问题引出)
🌕[三. 基本原理](#三. 基本原理)
🌓[四. Filter 过滤器 url-pattern](#四. Filter 过滤器 url-pattern)
🌕[五. Filter 过滤器生命周期](#五. Filter 过滤器生命周期)
🌓[六. FilterConfig](#六. FilterConfig)
🌔[七. FilterChain 过滤器链](#七. FilterChain 过滤器链)
🌸前言 :
📌📌📌 拦截请求,过滤响应
过滤器(Filter)是Java Web应用中的一种组件,它在请求到达Servlet或JSP之前或者响应送回客户端之前,对请求和响应进行预处理和后处理操作。通过使用过滤器,可以对请求进行过滤,拦截请求,修改请求参数,在请求被处理之前进行一些预处理操作;同时也可以对响应进行过滤,对响应内容进行修改,添加一些额外的处理。
🌸一. 问题引出
之前我们在做项目的时候, 如果要防止用户直接访问已经登录了的界面, 那么我们会用session来进行限制, 如果登录过的人, 就将登录信息add 到 session, 用户直接访问登录界面的时候就根据用户的sessionId进行查找, 如果有该用户, 那么就让其进行访问, 如果没有那么就跳转到登录窗口, 让其进行登录.
在这个过程中, session相当于一个过滤器, 将没有登录的人过滤出来, 重新进行登录.
但是这种应用只适合一个Servlet, 一个网页, 没有高效的进行过滤, 所以要寻找一种技术, 可以对多个请求Servlet的请求进行过滤, 提高代码效率, 主要是以下六点 :
-
业务逻辑分离 :过滤器能够将与业务逻辑无关的通用功能与具体的业务逻辑进行分离,使得代码结构更加清晰和易于管理。通过将不同的功能封装在不同的过滤器中,可以提高代码的可读性和可维护性。
-
代码复用性 :通过使用过滤器,可以将通用的处理逻辑在多个Servlet或JSP中实现复用,避免了在每个Servlet或JSP中重复编写相同的代码片段,提高了代码的复用性和开发效率。
-
通用功能的集中管理 :过滤器允许将多个通用功能集中在一起,并在一个地方进行管理。这样可以更好地控制和维护通用功能,减少了修改和扩展的工作量。同时,也方便对某一功能进行集中优化或调整。
-
安全性增强 :过滤器可以用于实现身份验证、权限控制等安全功能,对用户请求进行安全过滤,拦截恶意请求,防止跨站脚本(XSS)攻击和其他网络安全威胁。通过统一管理和处理,可以提高Web应用的安全性。
-
日志和性能监控 :过滤器可以用于记录请求和响应的详细信息,包括URL、参数、IP地址等,方便日志记录和性能监控。对于大型应用程序,过滤器的日志记录可以帮助快速定位问题和分析性能瓶颈。
-
请求和响应处理的统一性:通过过滤器,可以对请求和响应进行统一处理和修改。例如,可以对请求参数进行校验和过滤,对响应内容进行处理和封装,使得请求和响应的处理具有一致性和规范性。
二.Filter的介绍
1. Filter 过滤器它是 JavaWeb 的三大组件之一 (Servlet 程序、 Listener 监听器、 Filter 过 滤器 )
2. Filter 过滤器是 JavaEE 的规范,是接口
3. Filter 过滤器它的作用是:拦截请求,过滤响应。
4. 应用场景
● 权限检查
● 日记操作
● 事务管理
三. 基本原理
四. Filter过滤器url-pattern
1 、 url-pattern : Filter 的拦截路径 , 即浏览器在请求什么位置的资源时,过滤器会进行拦截过 滤
2. 、精确匹配 <url-pattern>/a.jsp</url-pattern> 对应的 请求地址 http://ip[ 域名 ]:port/ 工程 路径 /a.jsp 会拦截
3 、目录匹配 <url-pattern>/manage/*</url-pattern> 对应的 请求地址 http://ip[ 域名 ]:port/ 工程路径 /manage/xx , 即 web 工程 manage 目录下 所有资源 会拦截
4 、后缀名匹配 <url-pattern>*.jsp</url-pattern> 后缀名可变,比如 *.action *.do 等等对应 的请求地址 http://ip[ 域名 ]:port/ 工程路径 /xx.jsp , 后缀名为 .jsp 请求会拦截
5 、 Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在
五. Filter****过滤器生命周期
Filter(过滤器)在 Web 应用程序中具有生命周期,包括初始化和销毁两个阶段。其生命周期由 Web 容器负责管理。
-
初始化阶段:
- 当 Web 容器启动时,会检测并创建配置文件(如 web.xml)中定义的 Filter。
- 创建 Filter 实例,并调用
init()
方法进行初始化。 - 在
init()
方法中,可以进行一些一次性的初始化操作,如加载配置文件、创建资源等。
-
请求处理阶段:
- 在 Web 应用程序启动后,Filter 可以拦截、处理和修改来自客户端的请求和服务器的响应。
- 当有请求到达时,Web 容器会调用 Filter 的
doFilter()
方法,并传递请求和响应对象。 - 在
doFilter()
方法中,可以编写过滤逻辑,检查请求、修改请求或响应的内容,以及将请求传递给下一个 Filter 或目标资源。 - 如果存在多个 Filter,它们会按照 Filter 链的顺序依次执行。
-
销毁阶段:
- 当 Web 容器关闭或重启时,会销毁已创建的 Filter 实例。
- 调用 Filter 的
destroy()
方法进行销毁。 - 在
destroy()
方法中,可以执行一些清理操作,如释放资源、关闭连接等。
需要注意的是,在 Filter 的生命周期中,init()
和 destroy()
方法仅在 Filter 实例创建和销毁时调用一次,而 doFilter()
方法每次请求被拦截时都会被调用。
可以在 Filter 的 init()
方法中进行一些初始化配置的操作,如读取配置文件、初始化资源等。在 destroy()
方法中可以释放资源,做一些清理工作。
利用 Filter 的生命周期,开发人员可以在请求处理过程中实现自定义的逻辑,并对请求和响应进行处理、修改或增强。
同时,Servlet 3.0 引入了注解配置,可以使用 @WebFilter
注解来配置过滤器,并使用 initParams
和 destroyMethod
属性来设置初始化参数和销毁方法。
java
@WebFilter(urlPatterns = {"/example"}, initParams = {@WebInitParam(name = "param", value = "value")})
public class MyFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化逻辑
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 过滤逻辑
}
public void destroy() {
// 销毁逻辑
}
}
六. FilterConfig
FilterConfig 接口是在 Servlet 过滤器中使用的一个对象,它提供了用于获取过滤器配置信息的方法。当过滤器被初始化时,Web 容器将会创建一个 FilterConfig 对象,并将其作为参数传递给过滤器的 init()
方法。
FilterConfig 接口定义了以下方法:
-
getFilterName()
:获取过滤器的名称。javaString getFilterName();
-
getInitParameter(String name)
:根据参数名称获取初始化参数的值。javaString getInitParameter(String name);
-
getInitParameterNames()
:获取所有初始化参数的名称。javaEnumeration<String> getInitParameterNames();
-
getServletContext()
:获取 ServletContext 对象。javaServletContext getServletContext();
**FilterConfig 对象的主要作用是在过滤器初始化时,提供过滤器的配置信息、初始化参数和 servlet 上下文等。**使用 FilterConfig 对象,我们可以获取过滤器的名称、获取指定的初始化参数值以及获取 ServletContext 对象,进而访问全局的 Servlet 上下文。
在过滤器的 init()
方法中,可以通过 FilterConfig 参数获取这些信息,并进行相应的处理和配置。
示例:
java
public class MyFilter implements Filter {
private FilterConfig filterConfig;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
String filterName = filterConfig.getFilterName();
String initParamValue = filterConfig.getInitParameter("initParamName");
Enumeration<String> initParamNames = filterConfig.getInitParameterNames();
ServletContext servletContext = filterConfig.getServletContext();
// 进行相关的初始化操作
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 过滤逻辑
}
public void destroy() {
// 销毁逻辑
}
}
七. FilterChain****过滤器链
过滤器链是用于按照顺序执行多个过滤器的组件,通过调用 FilterChain 的 doFilter()
方法来传递请求和响应,实现过滤器的协作和控制流。
FilterChain(过滤器链)是在 Web 应用程序中使用的一个组件,用于管理多个过滤器的执行顺序和控制流。当一个请求到达时,Web 容器将会按照过滤器配置的顺序依次调用每个过滤器的 doFilter()
方法,形成一个过滤器链。
过滤器链的作用是让多个过滤器按照一定顺序对请求进行处理和过滤,并将请求传递给下一个过滤器,直到达到最终的目标资源(如 Servlet、JSP 等)。
FilterChain 接口定义了以下方法:
doFilter(ServletRequest request, ServletResponse response)
:执行下一个过滤器或目标资源的逻辑。
void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException;
**在每个过滤器的 doFilter()
方法中,可以调用 FilterChain 的 doFilter()
方法来传递请求和响应给下一个过滤器,或者传递给目标资源。**如果没有调用 doFilter()
方法,过滤器链将会被中断,请求将不会继续传递。
示例:
java
public class MyFilter1 implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化逻辑
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 过滤逻辑
// 调用下一个过滤器或目标资源
chain.doFilter(request, response);
}
public void destroy() {
// 销毁逻辑
}
}
public class MyFilter2 implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化逻辑
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 过滤逻辑
// 调用下一个过滤器或目标资源
chain.doFilter(request, response);
}
public void destroy() {
// 销毁逻辑
}
}
在上述示例中,有两个过滤器 MyFilter1 和 MyFilter2,它们按照配置顺序执行。在每个过滤器的 doFilter()
方法中,首先处理自定义的过滤逻辑,然后调用 chain.doFilter(request, response)
来传递请求和响应给下一个过滤器或目标资源。
过滤器链的执行顺序由过滤器的配置顺序决定,可以通过修改 web.xml 文件或使用注解配置来定义过滤器的顺序。