Filter过滤器

Posted 名字真的很急用

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Filter过滤器相关的知识,希望对你有一定的参考价值。

  • 1.Filter的介绍
    Filter是一个实现了javax.servlet.Filter接口的java类,也就是说如果想要实现这个类,必须实现Filter这个接口。
    Filter的作用就是实现对请求的资源(HTML,CSS,js,图片,音频,视频,jsp,servlet)过滤的功能,也就是说客户在访问资源之前,请求先会到达Filter,只有Filter放行之后,才能访问对应的资源。
    例如:大楼进出口的保安大叔,在你进入大楼之前得先让保安大叔进行测温,温度正常才能进入大楼。

    过滤器的应用场景:

  • 登录权限的校验

  • 过滤敏感字符

  • 解决网站的乱码

  • 2.Filter的初体验

package 过滤器;


import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class myFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      
            //解除过滤
           filterChain.doFilter(servletRequest, servletResponse);
        }
        System.out.println("1111111111");
    }

    @Override
    public void destroy() {

    }
}

实现过滤器有二种方式:

  • 基于注解的方法
import javax.servlet.annotation.WebFilter;
@WebFilter("")
  • 基于xml文件的配置方式
<filter>
        <filter-name>myFilter</filter-name>
        <filter-class>过滤器.myFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myFilter</filter-name>
        <url-pattern>/success.jsp</url-pattern>
    </filter-mapping>
  • 3.Filter的生命周期
    Filter的生命周期就是关注Filter对象什么时候被服务器创建和什么时候被服务器销毁
    Filter在服务器启动的时候被创建,创建Filter对象的时候会执行
public void init(FilterConfig filterConfig) throws ServletException

该方法通常会用于执行一些耗时操作的场景,例如从配置文件中读取数据,该方法只会执行一次

Filter在服务器关闭的时候被销毁,销毁的Filter对象的时候会执行 public void destroy() 方法,该方法用于序列化保存备份操作,该方法只会执行一次

 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException 

该方法用于对目标拦截路径操作的方法,该方法拦截一次就会执行一次,可以执行多次。

  • 4.Filter的三种拦截路径
<filter>
        <filter-name>Filters</filter-name>
        <filter-class>拦截的多种方式.Filters</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Filters</filter-name>
        <url-pattern>/*</url-pattern>
        <url-pattern>*.html</url-pattern>
        <url-pattern>*.jpg</url-pattern>
    </filter-mapping>

1.可以精准匹配拦截

<url-pattern>/login</url-pattern>

2.模糊匹配拦截,/*拦截所有的资源路径

<url-pattern>/*</url-pattern>

3.扩展名拦截

 <url-pattern>*.html</url-pattern>
 <url-pattern>*.jpg</url-pattern>
  • 5.Filter常用的二种拦截方式
    在web.xml文件中,一个元素用于配置一个Filter所负责拦截的资源。元素中有一个特殊的子元素该元素用于指定过滤器所拦截的资源被servlet容器调用的方式,常用的元素值如下:

1.REQUEST
当用户直接访问页面时,web容器会调用过滤器,如果目标资源是通过RequsetDispatcher的include()或forward()方法访问时,那么该过滤器将不会被调用。
2.FORWARD
如果目标资源是通过RequsetDispatcher的forward()方法访问时,那么该过滤器将会被调用,除此之外,该过滤器不会被调用。

基于web.xml配置的方式

<filter>
        <filter-name>myFilter</filter-name>
        <filter-class>过滤器.myFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myFilter</filter-name>
        <url-pattern>/success.jsp</url-pattern>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

基于注解的方法

@WebFilter(value = "/login",dispatcherTypes = {DispatcherType.FORWARD})
  • 6.Filter链
    过滤器链就是一系列的过滤器(多个)。
    过滤器链的作用就是一个请求可能被多个过滤器过滤,只有当所有的过滤器都放行的时候,客户端的请求才能到达目标资源,如有有一个过滤器没有放行,那么请求就无法到达后续的过滤器以及目标资源。

过滤器链的执行顺序。
因为过滤器既可以通过注解的方式和xml配置的方式来实现,
1.当过滤器全部采用注解的方式配置时,执行顺序就是通过过滤器名的顺序(字典顺序)就是按照过滤器名的开头字母顺序A-Z,0-9
2.如果按照xml的配置方式,则按照过滤器配置的前后顺序来执行。

以上是关于Filter过滤器的主要内容,如果未能解决你的问题,请参考以下文章

基于内部片段的graphql过滤器(gatsbyJS)

使用Logstash filter grok过滤日志文件

servlet,过滤器,监听器,拦截器的区别

vue实现简单的过滤器

Scapy BPF 过滤器不工作

在着色器中访问时,OpenGL如何决定使用MAG_FILTER和MIN_Filter?