目錄
在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訪問受保護得接口