在 Spring Boot 中使用 Filter 與前面的使用 Servlet 相似,根據 Filter 注冊方式的不同,有兩種使用方式。若使用的是 Servlet3.0+版本,則兩種方式均可使用;若使用的是 Servlet2.5版本,則只能使用配置類方式。
1.注解方式
若使用的是 Servlet3.0+版本,可以直接使用 Filter 的注解對 Filter 進行注冊。其總步驟有
兩步:
- 在定義好的 Filter 上使用@WebFilter 注解
- 在入口類上添加@ServletComponentScan 注解 --->需要寫掃描的包
1.1創建springboot
1.2創建filter
自定義filter實現Filter接口
package com.example.demo.filter;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author Created by niugang on 2019/7/20/15:46
*/
@WebFilter("/*")
@Slf4j
public class AccesLogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("AccesLogFilter init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String requesturi = request.getRequestURI();
log.info("Request URI:{}",requesturi);
filterChain.doFilter(request,response);
}
@Override
public void destroy() {
log.info("AccesLogFilter destroy");
}
}
1.3修改springboot啟動入口
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan(basePackages="com.example.demo.filter")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
2.配置方式
若使用的是 Servlet2.5 版本,沒有 Filter 注解,此時只能使用配置類方式。其總步驟有
兩步,與@ServletComponentScan 注解無關。
- 定義 Filter
- 定義配置類
2.1創建工程
2.2創建filter
package com.example.demo.filter;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author Created by niugang on 2019/7/20/15:46
*/
@Slf4j
public class AccesLogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("AccesLogFilter init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String requesturi = request.getRequestURI();
log.info("Request URI:{}",requesturi);
filterChain.doFilter(request,response);
}
@Override
public void destroy() {
log.info("AccesLogFilter destroy");
}
}
2.3修改配置類
package com.example.demo;
import com.example.demo.filter.AccesLogFilter;
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 DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public FilterRegistrationBean<AccesLogFilter> registration() {
//創建filter
AccesLogFilter accesLogFilter = new AccesLogFilter();
//注冊過濾器
FilterRegistrationBean<AccesLogFilter> registration = new FilterRegistrationBean<>(accesLogFilter);
//添加條件
registration.addUrlPatterns("/*");
return registration;
}
}
微信公眾號