Java Web之Filter(过滤器)

一、Filter简介

过滤器是处在客户端和服务器资源之间的一到过滤网,我们可以根据具体的需求来对请求头和数据就行预处理,也可以对响应头和和数据进行后处理。例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

二、Filter的工作原理

             

服务器的servlet容器接收到客户端发送的请求后,服务器的servlet容器根据web.xml配置文件中配置的Filter拦截客户端发送request,检查客户端request,如果不满足过滤要求,Filter拦截对应request;如果满足过滤要求,则在Filter中调用doFilter方法,执行request并对request进行处理并产生response,服务器将response发送给客户端之前,Filter会拦截response是否满足过滤要求,如果不满足,Filter会拦截response;如果满足过滤要求,则将response响应给客户端。

三、Filter的生命周期

1、初始化(init):filter的创建和销毁都是有服务器负责的。服务器启动的时候,web服务器创建Filter的实例对象,并调用其init方法,完成对象的初始化功能。filter对象只会创建一次,init方法也只会执行一次。

2、运行(doFilter):拦截到请求时,执行doFilter方法。可以执行多次。

3、销毁(destroy):服务器关闭时,web服务器销毁Filter的实例对象。

四、Filter的使用

1、过滤器的快速入门

1.1、定义一个类,实现接口Filter,并复写Filter接口doFilter方法

package com.wedu.demo.servlet;

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

/**
 * 过滤器快速入门
 */
public class FilterDemo implements Filter {
    public void init(FilterConfig config) throws ServletException {

    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("doFilter方法执行……");
        chain.doFilter(req, resp);
    }

    public void destroy() {
    }
}

1.2、配置拦截路径

以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_3_1.xsd"
         version="3.1">
    
    <!--配置过滤器Filter-->
    <filter>
        <filter-name>filter</filter-name>
        <filter-class>com.wedu.demo.servlet.FilterDemo</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <!--配置servlet的访问路径-->
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.wedu.demo.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

使用注解的方式配置拦截路径

 

2、过滤器的配置详解

2.1、配置拦截路径

  • 具体资源路径:只有访问指定的资源时,过滤器才会被执行,如:/index.jsp
  • 拦截目录:访问目录下的所有资源时,过滤器都会被执行,如:/user/*
  • 后缀名拦截:访问所有指定后缀名的资源时,过滤器就会被执行,如:*.jsp
  • 拦截所有资源:访问所有资源时,过滤器都会被执行,如:/*

2.2、拦截方式的配置

过滤器的四种拦截方式:REQUEST(默认的)、FORWARD、INCLUDE、ERROR。

  • REQUEST:直接访问目标资源时执行过滤器 。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST;
  • FORWARD:转发访问执行过滤器。包括:RequestDispatcher#forward()方法、<jsp:forward>标签都是转发访问;
  • INCLUDE:包含访问执行过滤器。包括:RequestDispatcher#include()方法、<jsp:include>标签都是包含访问;
  • ERROR:当目标资源在web.xml中配置为<error-page>中时,并且真的出现异常,转发到目标资源时,会执行过滤器;

使用web.xml方式配置:

<!--配置过滤器Filter-->
<filter>
    <filter-name>filter</filter-name>
    <filter-class>com.wedu.demo.servlet.FilterDemo</filter-class>
</filter>
<filter-mapping>
    <filter-name>filter</filter-name>
    <url-pattern>/*</url-pattern>
    <!--过滤器的拦截方式-->
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

使用注解的方式配置:

package com.wedu.demo.servlet;

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

/**
 * 过滤器的拦截方式配置
 */
@WebFilter(value = "/*",dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.REQUEST})
public class FilterDemo implements Filter {
    public void init(FilterConfig config) throws ServletException {
    }

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

    public void destroy() {
    }
}

2.3、多个过滤器的配置方式

web.xml配置

<!--配置过滤器Filter-->
<filter>
    <filter-name>filter1</filter-name>    
    <filter-class>com.wedu.demo.servlet.FilterDemo</filter-class>
</filter>
<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
    <filter-name>filter2</filter-name>    
    <filter-class>com.wedu.demo.servlet.FilterDemo</filter-class>
</filter>
<filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

注意:执行顺序根据<filter-mapping>定义,谁定义在上面谁先先执行。

注解方式配置

在定义的每个过滤器上面加上对应的注解即可。

注意:执行的顺序按照类名的字符串比较规则比较,值小的先执行。

五、Filter的应用

1、中文乱码处理

2、敏感词汇过滤

3、权限控制访问

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值