JavaWeb三大组件之Filter过滤器详解

 更新时间:2023年10月17日 09:33:09   作者:边境矢梦°  
这篇文章主要介绍了JavaWeb三大组件之Filter过滤器详解,过滤器Filter是Java Web应用中的一种组件,它在请求到达Servlet或JSP之前或者响应送回客户端之前,对请求和响应进行预处理和后处理操作,需要的朋友可以参考下

前言 :

拦截请求,过滤响应

过滤器(Filter)是Java Web应用中的一种组件,它在请求到达Servlet或JSP之前或者响应送回客户端之前,对请求和响应进行预处理和后处理操作。通过使用过滤器,可以对请求进行过滤,拦截请求,修改请求参数,在请求被处理之前进行一些预处理操作;同时也可以对响应进行过滤,对响应内容进行修改,添加一些额外的处理。

一.问题引出

之前我们在做项目的时候, 如果要防止用户直接访问已经登录了的界面, 那么我们会用session来进行限制, 如果登录过的人, 就将登录信息add 到 session, 用户直接访问登录界面的时候就根据用户的sessionId进行查找, 如果有该用户, 那么就让其进行访问, 如果没有那么就跳转到登录窗口, 让其进行登录.

在这个过程中, session相当于一个过滤器, 将没有登录的人过滤出来, 重新进行登录.

但是这种应用只适合一个Servlet, 一个网页, 没有高效的进行过滤, 所以要寻找一种技术, 可以对多个请求Servlet的请求进行过滤, 提高代码效率, 主要是以下六点 :

  1. 业务逻辑分离:过滤器能够将与业务逻辑无关的通用功能与具体的业务逻辑进行分离,使得代码结构更加清晰和易于管理。通过将不同的功能封装在不同的过滤器中,可以提高代码的可读性和可维护性。
  2. 代码复用性:通过使用过滤器,可以将通用的处理逻辑在多个Servlet或JSP中实现复用,避免了在每个Servlet或JSP中重复编写相同的代码片段,提高了代码的复用性和开发效率。
  3. 通用功能的集中管理:过滤器允许将多个通用功能集中在一起,并在一个地方进行管理。这样可以更好地控制和维护通用功能,减少了修改和扩展的工作量。同时,也方便对某一功能进行集中优化或调整。
  4. 安全性增强:过滤器可以用于实现身份验证、权限控制等安全功能,对用户请求进行安全过滤,拦截恶意请求,防止跨站脚本(XSS)攻击和其他网络安全威胁。通过统一管理和处理,可以提高Web应用的安全性。
  5. 日志和性能监控:过滤器可以用于记录请求和响应的详细信息,包括URL、参数、IP地址等,方便日志记录和性能监控。对于大型应用程序,过滤器的日志记录可以帮助快速定位问题和分析性能瓶颈。
  6. 请求和响应处理的统一性:通过过滤器,可以对请求和响应进行统一处理和修改。例如,可以对请求参数进行校验和过滤,对响应内容进行处理和封装,使得请求和响应的处理具有一致性和规范性。

二.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> 对应的 请求地址 //ip[ 域名 ]:port/ 工程 路径 /a.jsp 会拦截

3 、目录匹配 <url-pattern>/manage/*</url-pattern> 对应的 请求地址 //ip[ 域名 ]:port/ 工程路径 /manage/xx , 即 web 工程 manage 目录下 所有资源 会拦截

4 、后缀名匹配 <url-pattern>*.jsp</url-pattern> 后缀名可变,比如 *.action *.do 等等对应 的请求地址 //ip[ 域名 ]:port/ 工程路径 /xx.jsp , 后缀名为 .jsp 请求会拦截 5 、 Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在

五.Filter 过滤器生命周期

Filter(过滤器)在 Web 应用程序中具有生命周期,包括初始化和销毁两个阶段。其生命周期由 Web 容器负责管理。

  1. 初始化阶段:
    • 当 Web 容器启动时,会检测并创建配置文件(如 web.xml)中定义的 Filter。
    • 创建 Filter 实例,并调用 init() 方法进行初始化。
    • 在 init() 方法中,可以进行一些一次性的初始化操作,如加载配置文件、创建资源等。
  2. 请求处理阶段:
    • 在 Web 应用程序启动后,Filter 可以拦截、处理和修改来自客户端的请求和服务器的响应。
    • 当有请求到达时,Web 容器会调用 Filter 的 doFilter() 方法,并传递请求和响应对象。
    • 在 doFilter() 方法中,可以编写过滤逻辑,检查请求、修改请求或响应的内容,以及将请求传递给下一个 Filter 或目标资源。
    • 如果存在多个 Filter,它们会按照 Filter 链的顺序依次执行。
  3. 销毁阶段:
    • 当 Web 容器关闭或重启时,会销毁已创建的 Filter 实例。
    • 调用 Filter 的 destroy() 方法进行销毁。
    • 在 destroy() 方法中,可以执行一些清理操作,如释放资源、关闭连接等。

需要注意的是,在 Filter 的生命周期中,init()和destroy()方法仅在 Filter 实例创建和销毁时调用一次,而doFilter()方法每次请求被拦截时都会被调用。

可以在 Filter 的init()方法中进行一些初始化配置的操作,如读取配置文件、初始化资源等。在destroy()方法中可以释放资源,做一些清理工作。

利用 Filter 的生命周期,开发人员可以在请求处理过程中实现自定义的逻辑,并对请求和响应进行处理、修改或增强。

同时,Servlet 3.0 引入了注解配置,可以使用@WebFilter注解来配置过滤器,并使用initParams和destroyMethod属性来设置初始化参数和销毁方法。

@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():获取过滤器的名称。

String getFilterName();

getInitParameter(String name):根据参数名称获取初始化参数的值。

String getInitParameter(String name);

getInitParameterNames():获取所有初始化参数的名称。

Enumeration<String> getInitParameterNames();

getServletContext():获取 ServletContext 对象。

ServletContext getServletContext();

FilterConfig 对象的主要作用是在过滤器初始化时,提供过滤器的配置信息、初始化参数和 servlet 上下文等。

使用 FilterConfig 对象,我们可以获取过滤器的名称、获取指定的初始化参数值以及获取 ServletContext 对象,进而访问全局的 Servlet 上下文。

在过滤器的init()方法中,可以通过 FilterConfig 参数获取这些信息,并进行相应的处理和配置。

示例:

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()方法,过滤器链将会被中断,请求将不会继续传递。

示例:

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 文件或使用注解配置来定义过滤器的顺序。

到此这篇关于JavaWeb三大组件之Filter过滤器详解的文章就介绍到这了,更多相关JavaWeb的Filter过滤器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java基础之方法重写详解

    Java基础之方法重写详解

    这篇文章主要介绍了Java基础之方法重写详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • 如何通过jstack命令dump线程信息

    如何通过jstack命令dump线程信息

    这篇文章主要介绍了如何通过jstack命令dump线程信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Mybatis查询返回两个或多个参数问题

    Mybatis查询返回两个或多个参数问题

    这篇文章主要介绍了Mybatis查询返回两个或多个参数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Java超详细整理讲解各种排序

    Java超详细整理讲解各种排序

    这篇文章主要介绍了Java常用的排序算法及代码实现,在Java开发中,对排序的应用需要熟练的掌握,这样才能够确保Java学习时候能够有扎实的基础能力。那Java有哪些排序算法呢?本文小编就来详细说说Java常见的排序算法,需要的朋友可以参考一下
    2022-07-07
  • 浅谈MyBatis Plus主键设置策略

    浅谈MyBatis Plus主键设置策略

    本文主要介绍了MyBatis Plus主键设置策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Android bdflow数据库神器的使用

    Android bdflow数据库神器的使用

    这篇文章主要介绍了Android bdflow数据库神器的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Mybatis日志模块的适配器模式详解

    Mybatis日志模块的适配器模式详解

    这篇文章主要介绍了Mybatis日志模块的适配器模式详解,,mybatis用了适配器模式来兼容这些框架,适配器模式就是通过组合的方式,将需要适配的类转为使用者能够使用的接口
    2022-08-08
  • SpringBoot整合Dubbo+Zookeeper实现RPC调用

    SpringBoot整合Dubbo+Zookeeper实现RPC调用

    这篇文章主要给大家介绍了Spring Boot整合Dubbo+Zookeeper实现RPC调用的步骤详解,文中有详细的代码示例,对我们的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-07-07
  • Mybatis中的延迟加载详细解读

    Mybatis中的延迟加载详细解读

    这篇文章主要介绍了Mybatis中的延迟加载详细解读,Mybatis中延迟加载又称为懒加载,是指在进行关联查询时,按照设置延迟规则推迟对关联对象的select查询,延迟加载可以有效的减少数据库的压力,需要的朋友可以参考下
    2023-10-10
  • 浅谈Redis的key和value大小限制

    浅谈Redis的key和value大小限制

    这篇文章主要介绍了浅谈Redis的key和value大小限制,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11

最新评论