理解javax.servlet.Filter过滤器 ---- JavaWeb三大组件(Servlet、Filter、Listener)

JavaWEB三大组件加载顺序:listener -> filter -> servlet   (当读取web.xml文件的加载顺序)

javax.servlet.Filter 是一个接口,过滤请求,实现请求的拦截或者放行,并且添加新的功能。

从上面的顺序,知道  Filter 比 Servlet 先执行 ,那么Filter 就可以拦截请求了,也就是说,所有请求进来,都先在他这里走一遍,然后再到servlet的service中去

public class DemoFilter implements Filter {

    protected final Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.warn("DemoFilter状态:[{}]", "过滤器初始化");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        logger.warn("DemoFilter状态:[{}]", "执行过滤任务中");
        // 放行,执行下一个过滤器
        chain.doFilter(req, resp);
        logger.warn("DemoFilter状态:[{}]", "过滤执行完毕");
    }

    @Override
    public void destroy() {
        logger.warn("DemoFilter状态:[{}]", "过滤器销毁");
    }
}

过滤器匹配URL规则:

精确匹配 —— 如/foo.htm,只会匹配foo.htm这个URL
路径匹配 —— 如/foo/*,会匹配以foo为前缀的URL
后缀匹配 —— 如*.htm,会匹配所有以.htm为后缀的URL
其他写法,如/foo/ ,/.htm ,/foo 都是不对的

在使用Filter的时候,光上面的 实现Filter是不够的。必须在web.xml文件中配置Filter , 还可以自定义Filter的执行顺序等。 

下面我贴一段,SpringBoot使用Filter的代码:、

配置Filter:

package com.toad.config.filter;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

import javax.servlet.Filter;

/**
 * @author: wangqinmin
 * @date: 2019/4/22 16:16
 * @description: 仰天大笑出门去,我辈岂是蓬蒿人
 */
@Configuration
public class FilterConfig {

    @Bean
    public Filter demoFilter() {
        return new DemoFilter();
    }

    @Bean
    public Filter testFilter() {
        return new TestFilter();
    }

    /**
     * @return
     */
    @Bean
    @Order(value = 1) // 过滤器执行顺序
    public FilterRegistrationBean demoFilterBean() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(demoFilter());
        // 设置过滤的url
        registration.addUrlPatterns("/*");
        return registration;
    }

    @Bean
    @Order(2)
    public FilterRegistrationBean testFilterBean() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(testFilter());
        registration.addUrlPatterns(
                "/index.html",
                "/api/applications/views/*",
                "/api/applications-details/views/details.html",
                "/api/applications-logfile/views/logfile.html",
                "/api/applications-metrics/views/metrics.html",
                "/api/applications-environment/views/environment.html",
                "/api/applications-logging/views/logging.html",
                "/api/applications-jmx/views/jmx.html",
                "/api/applications-threads/views/threads.html",
                "/api/applications-auditevents/auditevents.html",
                "/api/applications-trace/views/trace.html",
                "/api/applications/*/logfile",
                "/api/applications/*/env");
        return registration;
    }
}

自定义Filter (我这里没有做什么过滤,都是直接放行了):

package com.toad.config.filter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author: wangqinmin
 * @date: 2019/4/22 15:31
 * @description: 仰天大笑出门去,我辈岂是蓬蒿人
 */
public class DemoFilter implements Filter {

    protected final Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.warn("DemoFilter状态:[{}]", "过滤器初始化");
    }

    /**
     * 暂时没有做任何过滤
     *
     * @param request
     * @param response
     * @param chain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        logger.warn("DemoFilter状态:[{}]", "执行过滤任务中");
        // 放行,执行下一个过滤器
        chain.doFilter(req, resp);
        logger.warn("DemoFilter状态:[{}]", "过滤执行完毕");
    }

    @Override
    public void destroy() {
        logger.warn("DemoFilter状态:[{}]", "过滤器销毁");
    }
}
package com.toad.config.filter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author: wangqinmin
 * @date: 2019/4/22 16:14
 * @description: 仰天大笑出门去,我辈岂是蓬蒿人
 */
public class TestFilter implements Filter {
    protected final Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.warn("TestFilter状态:[{}]", "过滤器初始化");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        logger.warn("TestFilter状态:[{}]", "执行过滤任务中");
        // 放行,执行下一个过滤器
        chain.doFilter(req, resp);
        logger.warn("TestFilter状态:[{}]", "过滤执行完毕");
    }

    @Override
    public void destroy() {
        logger.warn("TestFilter状态:[{}]", "过滤器销毁");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值