SpringBoot 2.X 過濾器



在SpringBoot中使用使用過濾器有兩種,一種是使用注解 @WebFilter,第二種是 FilterRegistrationBean

@WebFilter實現

@WebFilter用於一個類聲明過濾器,該注解將會在部署時被容器處理,容器將根據具體的屬性將相應的類部署為過濾器

屬性名 類型 描述
filterName String 指定該Filter的名稱
urlPatterns String 指定該Filter所攔截的URL
value String 與urlPatterns一致

創建一個MyFilter.java 並且實現Filter接口

package net.auio.filter.filter;

import org.springframework.core.annotation.Order;

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

@WebFilter(urlPatterns = "/api/*",filterName = "myFilter")
@Order(1) //指定過濾器的執行順序,值越大越靠后執行
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println(this.getClass().getName()+"被初始化....");
    }

    @Override
    public void destroy() {
        System.out.println(this.getClass().getName()+"被銷毀....");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      HttpServletRequest httpServletRequest =(HttpServletRequest) servletRequest;
        String requestURI = httpServletRequest.getRequestURI();
        String method = httpServletRequest.getMethod();
        System.out.println("請求URL:"+requestURI+"----請求方式:"+method);
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

啟動類上加上@ServletComponentScan注解

package net.auio.filter;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan
public class FilterApplication {

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

}

創建一個FilterController接口

package net.auio.filter.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/api")
public class TestController {

    @GetMapping(value = "/user/filter")
    public String hello(){
      return "通過FIlter,QAQ~";
    }
}

測試


FilterRegistrationBean 實現

創建MyFilerConfig

package net.auio.filter.config;

import net.auio.filter.filter.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyFilerConfig {


    @Bean
    public MyFilter myFilter(){
        return  new MyFilter();
    }

    @Bean
    public  FilterRegistrationBean filterRegistrationBean(MyFilter myFilter){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(myFilter);
        filterRegistrationBean.setOrder(1);
        filterRegistrationBean.addUrlPatterns("/api/*");
        filterRegistrationBean.setName("myFilter");
        return  filterRegistrationBean;
    }
}

修改MyFilter.java

刪除注解,或者注釋

//@WebFilter(urlPatterns = "/api/*",filterName = "myFilter")
//@Order(1) //指定過濾器的執行順序,值越大越靠后執行

啟動類刪除@ServletComponentScan

package net.auio.filter;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
public class FilterApplication {

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

}

測試


過濾校驗用戶是否登錄實戰

修改application.properties加入開發接口通配地址

#凡是請求地址層級帶有 open都放行
open.url=/**/open/**

修改myFilter

package net.auio.filter.filter;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.annotation.Order;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;

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


//@WebFilter(urlPatterns = "/api/*",filterName = "myFilter")
//@Order(1) //指定過濾器的執行順序,值越大越靠后執行
public class MyFilter implements Filter {

    @Value("${open.url}")
    private String openUrl;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println(this.getClass().getName()+"被初始化....");
    }

    @Override
    public void destroy() {
        System.out.println(this.getClass().getName()+"被銷毀....");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      HttpServletRequest httpServletRequest =(HttpServletRequest) servletRequest;
        String requestURI = httpServletRequest.getRequestURI();
        String method = httpServletRequest.getMethod();
        System.out.println("請求URL:"+requestURI+"----請求方式:"+method);
        //判斷是否開放性API
        PathMatcher pathMatcher=new AntPathMatcher();
        if (pathMatcher.match(openUrl,requestURI)){
            filterChain.doFilter(servletRequest, servletResponse);
        }else{
            String token = httpServletRequest.getHeader("token");
            if(StringUtils.isEmpty(token)){
                servletRequest.getRequestDispatcher("/api/open/unLogin").forward(servletRequest, servletResponse);
            }else{
                filterChain.doFilter(servletRequest, servletResponse);
            }
        }
        //判斷是否攜帶憑證

        filterChain.doFilter(servletRequest, servletResponse);
    }
}

新增未登錄接口,首頁接口

package net.auio.filter.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/api")
public class FilterController {

    @GetMapping(value = "/user/filter")
    public String hello(){
      return "我被MYFILTER監視了";
    }


    @GetMapping(value = "/home/open/info")
    public String getHome(){
       return "歡迎訪問首頁";
    }

    @GetMapping(value = "/open/unLogin")
    public String getUnLogin(){
        return "登錄失效,請重新登錄!";
    }
}

測試

訪問未開放得接口

訪問開放接口

攜帶TOKEN訪問受保護得接口


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM