SpringBoot实战:SpringBoot之过滤器

左心房为你撑大大i 提交于 2020-03-10 12:01:50
首先我们说说什么是过滤器,过滤器是对数据进行过滤,预处理过程,当我们访问网站时,有时候会发布一些敏感信息,发完以后有的会用*替代,还有就是登陆权限控制等,一个资源,没有经过授权,肯定是不能让用户随便访问的,这个时候,也可以用到过滤器。过滤器的功能还有很多,例如实现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"
};
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!