首先我们说说什么是过滤器,过滤器是对数据进行过滤,预处理过程,当我们访问网站时,有时候会发布一些敏感信息,发完以后有的会用*替代,还有就是登陆权限控制等,一个资源,没有经过授权,肯定是不能让用户随便访问的,这个时候,也可以用到过滤器。过滤器的功能还有很多,例如实现URL级别的权限控制、压缩响应信息、编码格式等等。过滤器依赖servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤。下面简单的说说Spring Boot里面如何增加过滤器。
接下来我们将演示SpringBoot如何集成过滤器的,主要通过两种方式来实现。
方式一:通过@WebFilter注解来实现
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author wusy
* Company: xxxxxx科技有限公司
* Createtime : 2020/3/10 10:56
* Description : 自定义过滤器
*/
@Component
@WebFilter(urlPatterns = "/*", filterName = "CustomFilter")
@Order(1)
public class CustomFilter implements Filter {
private Logger logger = LoggerFactory.getLogger(CustomFilter.class);
/**
* 需要忽略的地址
*/
private static String[] ignores = new String[]{
};
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//判断url是否需要拦截
if (this.ignoring(request.getRequestURI())) {
chain.doFilter(request, response);
return;
}
logger.info("这个是自定义的拦截器");
chain.doFilter(request, response);
}
/**
* 判断url是否需要拦截
* @param uri
* @return
*/
private boolean ignoring(String uri) {
for (String string : ignores) {
if (uri.contains(string)) {
return true;
}
}
return false;
}
}
接下来我们启动项目然后在浏览器中输入http://127.0.0.1:8787/swagger-ui.html(上一篇介绍过如何集成swagger),观察结果
方式二:通过@Bean注册一个FilterRegistrationBean类
首先应该删除方式一中CustomFilter类中的@WebFilter等注解,使他成为一个没有任何注解普通类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author wusy
* Company: xxxxxx科技有限公司
* Createtime : 2020/3/10 10:56
* Description : 自定义过滤器
*/
public class CustomFilter implements Filter {
private Logger logger = LoggerFactory.getLogger(CustomFilter.class);
/**
* 需要忽略的地址
*/
private static String[] ignores = new String[]{
};
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//判断url是否需要拦截
if (this.ignoring(request.getRequestURI())) {
chain.doFilter(request, response);
return;
}
logger.info(request.getRequestURI() +" 这个是自定义的拦截器");
chain.doFilter(request, response);
}
/**
* 判断url是否需要拦截
* @param uri
* @return
*/
private boolean ignoring(String uri) {
for (String string : ignores) {
if (uri.contains(string)) {
return true;
}
}
return false;
}
}
然后添加@Bean的配置信息
/**
* 自定义过滤器
* @return
*/
@Bean
public FilterRegistrationBean customFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
CustomFilter filter = new CustomFilter();
//注入过滤器
registration.setFilter(filter);
//拦截规则
registration.addUrlPatterns("/*");
//过滤器名称
registration.setName("CustomFilter");
//过滤器顺序
registration.setOrder(1);
return registration;
}
接下来我们启动项目然后在浏览器中输入http://127.0.0.1:8787/swagger-ui.html(上一篇介绍过如何集成swagger),观察结果
从两种方式的演示结果可以看出两种方式的结果是一样的,通常项目中使用方式一的比较多。
注意:过滤会对所有的请求都会进行拦截包含前端页面和脚本,所以如果后续想对swagger相关的地址不拦截应该在过滤的地址添加swagger相关地址
/**
* 需要忽略的地址
*/
private static String[] ignores = new String[]{
//过滤swagger相关的请求的接口,不然swagger会提示base-url被拦截
"/swagger-ui",
"/swagger-resources",
"/v2/api-docs"
};
来源:oschina
链接:https://my.oschina.net/u/2250817/blog/3190912