springboot 2.1 实践教程(十一)-注册过滤器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/java_cxrs/article/details/89792335

什么是过滤器?

Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

Filter链

在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。

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

 

 

(以上图片来自网络)

在没有使用Spring Boot时如果我们要配置一个filter过滤器,需要在web.xml里配置<filter>,然而Spring Boot没有web.xml,那么我们如何配置filter过滤器呢?

Spring Boot注册过滤的方式有三种:

方式1:启动类中注册Filter

a)创建Controller

package org.learn.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class TestFilterController {

    @GetMapping("/testfilter")
    public String TestF(){

        System.out.println("执行了TestFilterController的TestF方法");
    return "testFilter";
    }
}

b)创建过滤器类TestFilter

package org.learn.filter;


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

    public class TestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("执行Controller前的TestFilter处理");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("执行Controller后的TestFilter处理");
    }

    @Override
    public void destroy() {

    }
}

c)在入口类中注册Filter过滤器

package org.learn;

import org.learn.filter.TestFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringBootLearnApplication {

    //入口类注册Filter
    @Bean //将方法中返回的对象注入到IOC容器中
    public FilterRegistrationBean filterRegiste(){
        FilterRegistrationBean reFilter = new FilterRegistrationBean();
        reFilter.setFilter(new TestFilter()); //创建并注册TestFilter
        reFilter.addUrlPatterns("/*"); //拦截的路径(对所有请求拦截)
        reFilter.setName("TestFilter"); //拦截器的名称
        reFilter.setOrder(1); //拦截器的执行顺序。数字越小越先执行
        return  reFilter;

    }

    public static void main(String[] args) {
        SpringApplication.run(SpringBootLearnApplication.class, args);
    }

}

d)执行启动类并发起请求

请求 http://localhost:8080/testfilter,从控制台输出我们可以看到

 

表明我们的Filter注册成功,改请求先是被Filter拦截,进行处理后在Controller执行,执行完成后,再执行 filterChain.doFilter(servletRequest,servletResponse)后的内容。

方式2:创建FilterConfig类注入为IOC容器内

a)创建FilterConfig类,将TestFilter注册至IOC

package org.learn.config;

import org.learn.filter.TestFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean //将方法中返回的对象注入到IOC容器中
    public FilterRegistrationBean filterRegiste(){
        FilterRegistrationBean reFilter = new FilterRegistrationBean();
        reFilter.setFilter(new TestFilter()); //创建并注册TestFilter
        reFilter.addUrlPatterns("/*"); //拦截的路径(对所有请求拦截)
        reFilter.setName("TestFilter"); //拦截器的名称
        reFilter.setOrder(1); //拦截器的执行顺序。数字越小越先执行
        return  reFilter;

    }
}

b)将启动类SpringBootApplication中注册Filter过滤器相关代码删除

package org.learn;

import org.learn.filter.TestFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringBootLearnApplication {

/*    //入口类注册Filter
    @Bean //将方法中返回的对象注入到IOC容器中
    public FilterRegistrationBean filterRegiste(){
        FilterRegistrationBean reFilter = new FilterRegistrationBean();
        reFilter.setFilter(new TestFilter()); //创建并注册TestFilter
        reFilter.addUrlPatterns("/*"); //拦截的路径(对所有请求拦截)
        reFilter.setName("TestFilter"); //拦截器的名称
        reFilter.setOrder(1); //拦截器的执行顺序。数字越小越先执行
        return  reFilter;

    }*/

    public static void main(String[] args) {
        SpringApplication.run(SpringBootLearnApplication.class, args);
    }

}

c)执行启动类并发起请求请求 http://localhost:8080/testfilter,从控制台输出我们可以看到,跟方式1得到的结果一致。

方式3:@WebFilter

a)在TestFilter类上增加@WebFilter,说明该类是一个Filter

@WebFilter(filterName ="TestFilter",urlPatterns = "/*")

package org.learn.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
    @WebFilter(filterName ="TestFilter",urlPatterns = "/*")
    public class TestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("执行Controller前的TestFilter处理");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("执行Controller后的TestFilter处理");
    }

    @Override
    public void destroy() {

    }
}

b)删除FilterConfig类,或将其代码全部注释(方式2需要该类)

c)在项目启动类中增加注解@ServletComponentScan,通过该注解系统会去扫描Filter文件

package org.learn;

import org.learn.filter.TestFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@ServletComponentScan
public class SpringBootLearnApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootLearnApplication.class, args);
    }

}

d)执行项目启动类,并输入http://localhost:8080/testfilter,输出结果和方式1、方式2效果一致,表明注册过滤器成功

以上就是三种注册过滤器的方式,推荐方式2、方式3更易于管理。

猜你喜欢

转载自blog.csdn.net/java_cxrs/article/details/89792335