JavaWEB 过滤器

过滤器概述

Filter,即过滤器,是JAVAEE技术规范之一,作用目标资源的请求进行过滤的一套技术规范,是Java Web项目中最为实用的技术之一

  • Filter接口定义了过滤器的开发规范,所有的过滤器都要实现该接口

  • Filter的工作位置是项目中所有目标资源之前,容器在创建HttpServletRequest和HttpServletResponse对象后,会先调用Filter的doFilter方法

  • Filter的doFilter方法可以控制请求是否继续,如果放行,则请求继续,如果拒绝,则请求到此为止,由过滤器本身做出响应

  • Filter不仅可以对请求做出过滤,也可以在目标资源做出响应前,对响应再次进行处理

  • Filter是GOF中责任链模式的典型案例

  • Filter的常用应用包括但不限于: 登录权限检查,解决网站乱码,过滤敏感字符,日志记录,性能分析... ...

  • API目标

API 目标
default public void init(FilterConfig filterConfig) 初始化方法,由容器调用并传入初始配置信息filterConfig对象
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 过滤方法,核心方法,过滤请求,决定是否放行,响应之前的其他处理等都在该方法中
default public void destroy() 销毁方法,容器在回收过滤器对象之前调用的方法

过滤器使用

 

目标:开发一个日志记录过滤器

  • 用户请求到达目标资源之前,记录用户的请求资源路径

  • 响应之前记录本次请求目标资源运算的耗时

  • 可以选择将日志记录进入文件,为了方便测试,这里将日志直接在控制台打印

使用过滤器的操作步骤

①实现Filter接口 ② 重写过滤方法 ③配置过滤器

 

关于doFilter方法
doFilter方法内分为三步:

①请求到达目标资源之前的功能代码

②放行代码

③响应之前的功能代码

  • 放行代码为:filterChain.doFilter(servletRequest,servletResponse); 放行代码即为将请求递给Servlet的service方法或者给下一个过滤器
  • 在放行代码之前的代码就是请求到达目标资源之前的功能代码,对未到service方法的请求做处理,在放行代码之后的代码就是service方法发出的响应在到达客户端之前做处理。
  • service中的一些业务处理可以放在doFilter方法中进行处理

过滤器生命周期

过滤器作为web项目的组件之一,和Servlet的生命周期类似,略有不同,没有servlet的load-on-startup的配置,默认就是系统启动立刻构造

阶段 对应方法 执行时机 执行次数
创建对象 构造器 web应用启动时 1
初始化方法 void init(FilterConfig filterConfig) 构造完毕 1
过滤请求 void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 每次请求 多次
销毁 default void destroy() web应用关闭时 1次

 

通过web.xml配置过滤器

例:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="<https://jakarta.ee/xml/ns/jakartaee>"
         xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>"
         xsi:schemaLocation="<https://jakarta.ee/xml/ns/jakartaee> <https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd>"
         version="5.0">
 
    <!--配置filter,并为filter起别名-->
   <filter>
       <filter-name>loggingFilter</filter-name>
       <filter-class>com.atguigu.filters.LoggingFilter</filter-class>
   </filter>
    <!--为别名对应的filter配置要过滤的目标资源-->
    <filter-mapping>
        <filter-name>loggingFilter</filter-name>
        <!--通过映射路径确定过滤资源-->
        <url-pattern>/servletA</url-pattern>
        <!--通过后缀名确定过滤资源-->
        <url-pattern>*.html</url-pattern>
        <!--通过servlet别名确定过滤资源-->
        <servlet-name>servletBName</servlet-name>
 
    </filter-mapping>
</web-app>

说明

  • filter-mapping标签中定义了过滤器对那些资源进行过滤

  • 子标签url-pattern通过映射路径确定过滤范围

    • /servletA 精确匹配,表示对servletA资源的请求进行过滤

    • *.html 表示对以.action结尾的路径进行过滤

    • /* 表示对所有资源进行过滤

    • 一个filter-mapping下可以配置多个url-pattern

  • 子标签servlet-name通过servlet别名确定对那些servlet进行过滤

    • 使用该标签确定目标资源的前提是servlet已经起了别名

    • 一个filter-mapping下可以定义多个servlet-name

    • 一个filter-mapping下,servlet-name和url-pattern子标签可以同时存在

 

过滤器链

一个web项目中,可以同时定义多个过滤器,多个过滤器对同一个资源进行过滤时,工作位置有先后,整体形成一个工作链,称之为过滤器链

 

过滤器链功能测试

  • 定义三个过滤器,对目标资源Servlet的请求进行过滤

  • 目标Servlet资源代码

package com.atguigu.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet("/servletC")
public class ServletC extends HttpServlet {
    @Override
    protected void service(HttpServle
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值