springBoot之切片拦截请求(使用filter)

2019-06-28  本文已影响0人  寂静的春天1988

进入请求的前后,做一些事情。比如打印日志,或者校验数据合法等等。
可以使用三种方式:

一、使用filter

filter类代码

package com.ganlong.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Component;
@Component
public class TimeFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化filter");

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        String requestURI = req.getRequestURI();
        if (requestURI.contains("favicon.ico")) {
            return;
        }
        System.out.println("Filter开始");
        //进入下一个filter没有filter了则放行请求
        chain.doFilter(request, response);
        System.out.println("Filter结束");
    }
    @Override
    public void destroy() {
        System.out.println("filter销毁");
    }
}

总结:非常简单只需要实现一个filter接口实现三个方法,然后使用@Component方法注入spring容器即可

上面是自己定义的filter,假如是第三方的库中的filter怎么假如过滤器链呢?可以使用@bean注入到容器中

@Configuration
public class WebConfig {
    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
        //加入过滤器
        filterRegistrationBean.setFilter(new TimeFilter());
        //定义过滤器路径
        ArrayList<String> urlList=new ArrayList();
        urlList.add("/*");
        filterRegistrationBean.setUrlPatterns(urlList);
        return filterRegistrationBean;
    }
}

总结:注入一个FilterRegistrationBean ,将filter设置进filterRegistrationBean中然后可以设置过滤器的路径。

注意:

HttpServletRequest req = (HttpServletRequest) request;
String requestURI = req.getRequestURI();
if (requestURI.contains("favicon.ico")) {
    return;
}

在浏览器中测试过滤器时发现进入了过滤器两次,因为浏览器自己主动的又请求了一次图标静态资源,所以过滤器又拦截了一次。
所以判断了一下请求图标静态资源时直接返回。

上一篇下一篇

猜你喜欢

热点阅读