1. 定义自己的过滤器
Spring-boot中的过滤器需要实现javax.servlet.Filter的接口,接口提供了三个重载方法,分别为init,doFilter,destroy,其中过滤的逻辑放在doFilter中,且必须实现这个方法。
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 {
//过滤逻辑,这里获取了发送请求的地址
String remoteHost = servletRequest.getRemoteHost();
logger.info("TestFilter filter: " + remoteHost);
//这里继续下一个过滤器
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
logger.info("TestFilter destroy");
}
}
2.注册过滤器容器配置
根据spring-boot提供的注册组件进行过滤器注册,可新建一个注册文件FilterConfig.java用于注册自定义的过滤器
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启动时扫描
@Configuration
public class FilterConfig {
/**
* 注册第三方过滤器
* 功能与spring mvc中通过配置web.xml相同
* 可以添加过滤器所拦截的 URL,拦截更加精准灵活
* @return
*/
@Bean
public FilterRegistrationBean testFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new TestFilter());
// 过滤应用程序中所有资源,当前应用程序根下的所有文件包括多级子目录下的所有文件,注意这里*前有“/”
registration.addUrlPatterns("/*");
//可自定义初始参数
registration.addInitParameter("paramName", "paramValue");
registration.setName("TestFilter");
// 过滤器顺序,数字越小约先执行
registration.setOrder(1);
return registration;
}
}
网友评论