【Filter教科书】Filter过滤器技术总结(Filter实现自动登录、过滤脏词功能等)

本文详细介绍了Java Web中的Filter过滤器技术,包括其概念、生命周期、开发步骤、配置方式、过滤器链和优先级、初始化参数问题。通过实例展示了如何使用Filter实现自动登录功能和过滤敏感词汇,降低代码耦合,提升安全性。
摘要由CSDN通过智能技术生成

一、什么是过滤器

Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。

二、了解过滤器

2.1 简单概念

过滤器就是一个用于在请求之前处理资源的组件

2.2 生命周期
  • 随着服务器启动而启动
  • 随着发起请求而过滤
  • 随着服务器的关闭而销毁
2.3 执行流程
  1. 浏览器发起请求
  2. 服务器会根据请求,创建request对象和response对象
  3. 过滤器持有request对象和response对象
  4. 只有当过滤器放行之后,request对象和response对象才会传给Servlet

注意:关于放行,Filter遵循“先配置后放行”的原则

三、过滤器的开发步骤

  1. java类实现Filter接口
  2. 重写doFilter方法
  3. 过滤处理
  4. 过滤处理后,使用FilterChain放行
  5. 设置需要xml配置或注解配置

注意:实现Filter接口的时候是实现javax.servlet.Filter接口

package com.mylifes1110.java.filter;

import javax.servlet.*;
import java.io.IOException;

public class FirstFilter implements Filter {
   

    /**
     * 过滤器的初始化方法
     * 过滤器是随着服务器的初始化而初始化
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
   
        System.out.println("---Filter初始化---");
    }

    /**
     * 过滤器的处理服务
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
   
        //过滤器处理请求
        System.out.println("---Filter处理请求---");
        //使用过滤器链放行
        filterChain.doFilter(servletRequest, servletResponse);
    }

    /**
     * 过滤器的销毁
     * 过滤器的销毁是随着服务器的关闭而销毁
     */
    @Override
    public void destroy() {
   
        System.out.println("---Filter销毁---");
    }
}

四、过滤器的配置方式

过滤器和Servlet相同有两种配置方式xml配置和注解配置

注意:由于过滤器的特殊场景应用,比如:使用过滤器来解决中文乱码问题等等,我们需要xml配置,而注解配置改变不了我们特殊场景的便利

4.1 xml配置

xml配置和Serlvet配置极其相似,感觉就是把Servlet换成了Filter,下面展示了两个Filter的xml配置

	<!--声明FirstFilter过滤器-->
    <filter>
		<!--名称-->
        <filter-name>FirstFilter</filter-name>
        <!--过滤器类全称-->
        <filter-class>com.mylifes1110.java.filter.FirstFilter</filter-class>
    </filter>
     <!--映射路径配置-->
    <filter-mapping>
		<!--名称-->
        <filter-name>FirstFilter</filter-name>
        <!--/*代表过滤所有资源-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
	<filter>
        <filter-name>FirstFilter1</filter-name>
        <filter-class>com.mylifes1110.java.filter.FirstFilter1</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FirstFilter1</filter-name>
        <!--根据路径只过滤这个Servlet-->
<!--        <url-pattern>/tff</url-pattern>-->
        <!--根据Servlet名称只过滤这个Serlvet-->
        <servlet-name>TestFirstFilterServlet</servlet-name>
    </filter-mapping>
4.2 注解配置

在自定义的Filter类上使用注解@WebFilter即可

  • filterName表示Filter名称
  • value或urlPatterns表示需要过滤的Servlet路径
  • initParams表示初始化参数
package com.mylifes1110.java.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;
import java.util.Enumeration;

/**
 * 注解配置
 * 注意:value和urlPatterns是相同作用
 * IDEA为了一部分人的编码习惯加了value
 */
@WebFilter(filterName = "AnnotationFilter", value = "/*",initParams = {
   
        @WebInitParam(name = "username", value = "join"),
        @WebInitParam(name = "password", value = "123456")})
public class AnnotationFilter implements Filter {
   
    public void destroy() {
   
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
   
        System.out.println("AnnotationFilterAnnotationFilterAnnotationFilterAnnotationFilterAnnotationFilter");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {
   
        
        }
    }
}

五、IDEA快速创建Filter过滤器

在创建Servlet的时候IDEA为我们提供了快速创建Servlet的方法,同样,过滤器的创建也提供了快捷的创建方法

在这里插入图片描述

在这里插入图片描述

创建结果如下:

在这里插入图片描述

六、过滤器链与优先级问题

6.1 什么是过滤器链

通常客户端对服务器请求之后,服务器调用Servlet之前会执行一组过滤器(多个过滤器),那么这组过滤器就称为一条过滤器链。
每个过滤器实现某个特定的功能,一个过滤器检测多个Servlet。(匹配几个,检测几个)。
一组过滤器中的执行顺序与的配置顺序有关。
当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源

6.2 过滤器的优先级

在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter。当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源

在xml配置中,过滤器的优先级是根据filter-mapping注册顺序,从上往下执行

在注解中,过滤器是按照类名的字典顺序执行的。如果不同包的Filter类,先按照包名的字典顺序寻找Filter,分包后再按照类名字典顺序执行

注意:xml配置的优先级高于注解配置的优先级

七、过滤器的初始化参数问题

7.1 xml配置初始化参数及获取(推荐)

xml配置信息如下:

	<filter>
        <filter-name>GetFilterConfigFilter</filter-name>
        <filter-class>com.mylifes1110.java.filter.GetFilterConfigFilter</filter-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>ziph</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>123456</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>GetFilterConfigFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Filter获取初始化参数代码如下:

package com.mylifes1110.java.filter;

import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;

public class GetFilterConfigFilter implements Filter {
   

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
   
        /**
         * 获取指定初始化参数
         */
        String name = filterConfig.getInitParameter("name");
        System.out.println(name);

        /**
         * 获取全部初始化参数
         */
        Enumeration
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值