当前位置:网站首页>Servlet之过滤器和监听器

Servlet之过滤器和监听器

2020-12-07 16:22:20 Songyf

过滤器

1、概念

  • 过滤器是能够对web请求和web响应的头属性和内容体进行操作的一种特殊web组件
  • 过滤器的特殊之处在于本身并不直接生成web响应,而是拦截web请求和响应,以便查看、提取或以某种方式操作客户机和服务器之间交换的数据

2、过滤器的功能

  • 分析web请求,对输入数据进行预处理
  • 阻止web请求和响应的进行
  • 根据功能改动请求的头信息和数据体
  • 与其他web资源协作

3、过滤器的基本原理
image

4、用法

  • 配置web.xml
<?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>filter</filter-name>
        <filter-class>com.syf.filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>FilterServlet</servlet-name>
        <servlet-class>com.syf.FilterServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FilterServlet</servlet-name>
        <url-pattern>/filter</url-pattern>
    </servlet-mapping>
</web-app>
  • 定义过滤器
package com.syf.filter;
import javax.servlet.*;
import java.io.IOException;
/**
 * 自定义过滤器,完成请求拦截及资源统一管理功能
 * 实现方式及生命周期:
 * 定义java类实现Filter接口
 * 重写接口方法
 *      init:初始化 tomcat启动的时候执行一次
 *      doFilter:进行拦截处理        每次请求都会执行
 *      destroy:销毁 Tomcat关闭的时候执行
 */
public class MyFilter implements Filter {
    @Override
 public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("第一个过滤器初始化");
    }
    @Override
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("第一个过滤器执行开始");
        //调用对应的Servlet
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("第一个过滤器执行结束");
    }
    @Override
 public void destroy() {
        System.out.println("第一个过滤器销毁");
    }
}
  • 过滤器链

FilterChain接口用于调用过滤器链中的一系列过滤器
image
增加一个过滤器MyFilter2

public class MyFilter2 implements Filter {
    @Override
 public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("第二个过滤器初始化");
    }
    @Override
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("第二个过滤器执行开始");
        //调用对应的Servlet
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("第二个过滤器执行结束");
    }
    @Override
 public void destroy() {
        System.out.println("第二个过滤器销毁");
    }
}

配置web.xml

<filter>
    <filter-name>filter2</filter-name>
    <filter-class>com.syf.filter.MyFilter2</filter-class>
</filter>
<filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  • 在项目中可以定义多个过滤器,开始执行的时候,根据用户的请求,把符合规则的过滤器挨个执行。
  • 最好每个过滤器完全独立的过滤功能,不要将多个逻辑处理放置到同一个过滤器中,耦合度高,不利于维护
  • 在web.xml配置文件中,可以配置过滤器过滤哪些请求

/*:匹配所有请求
/*.xx:匹配后缀为xx的请求
/xx.xx:匹配请求为xx.xx的请求

监听器

1、作用
监听作用域对象的创建与销毁及属性的相关配置,可以添加一些公共的属性配置,做逻辑判断等
主要监听三种作用域:ServletContext、session、request

版权声明
本文为[Songyf]所创,转载请带上原文链接,感谢
https://segmentfault.com/a/1190000038401737