1. 定義自己的過濾器
Spring-boot中的過濾器需要實(shí)現(xiàn)javax.servlet.Filter的接口,接口提供了三個(gè)重載方法,分別為init,doFilter,destroy,其中過濾的邏輯放在doFilter中,且必須實(shí)現(xiàn)這個(gè)方法。
TestFilter.java
package com.seasky.servicesitespring.filter;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.servlet.*;
import java.io.IOException;
public class TestFilter implements Filter {
private static final Logger logger = LogManager.getLogger();//僅用于輸出日志
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.info("TestFilter init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//過濾邏輯,這里獲取了發(fā)送請(qǐng)求的地址
String remoteHost = servletRequest.getRemoteHost();
logger.info("TestFilter filter: " + remoteHost);
//這里繼續(xù)下一個(gè)過濾器
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
logger.info("TestFilter destroy");
}
}
2.注冊(cè)過濾器容器配置
根據(jù)spring-boot提供的注冊(cè)組件進(jìn)行過濾器注冊(cè),可新建一個(gè)注冊(cè)文件FilterConfig.java用于注冊(cè)自定義的過濾器
FilterConfig.java
package com.seasky.servicesitespring.config;
import com.seasky.servicesitespring.filter.MyFilter;
import com.seasky.servicesitespring.filter.TestFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//添加Configure注解用于spring-boot啟動(dòng)時(shí)掃描
@Configuration
public class FilterConfig {
/**
* 注冊(cè)第三方過濾器
* 功能與spring mvc中通過配置web.xml相同
* 可以添加過濾器所攔截的 URL,攔截更加精準(zhǔn)靈活
* @return
*/
@Bean
public FilterRegistrationBean testFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new TestFilter());
// 過濾應(yīng)用程序中所有資源,當(dāng)前應(yīng)用程序根下的所有文件包括多級(jí)子目錄下的所有文件,注意這里*前有“/”
registration.addUrlPatterns("/*");
//可自定義初始參數(shù)
registration.addInitParameter("paramName", "paramValue");
registration.setName("TestFilter");
// 過濾器順序,數(shù)字越小約先執(zhí)行
registration.setOrder(1);
return registration;
}
}