A-A+

SpringBoot – 过滤器和拦截器

2020年04月12日 技术, 默认 暂无评论 阅读 2,510 次

最近业余时间比较紧张,更得挤时间来记录了,今天介绍一下SpringBoot项目,如何使用过滤器和拦截器。

本文基于SpringBoot 2.2.5 RELEASE。

首先,介绍一下拦截器的使用办法,拦截器相对来说简单一些。

声明一个拦截器,和之前Spring MVC是一样的,继承自HandlerInterceptorAdapter,主要的代码如下:

public class TestInterceptor extends HandlerInterceptorAdapter {

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception {

    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView view) throws Exception {

    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //可以进入处理器之前,自定义一些验证,比如是否登录
        return true;    
    }
}

在声明拦截器之后,需要令其生效。就需要声明一个配置类,继承自WebMvcConfigurer,主要的代码如下:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Resource
    private TestInterceptor testInterceptor;

    @Bean
    public TestInterceptor getTestInterceptor() {
        return new TestInterceptor();
    }

    /**
     * 拦截器注册
     */

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(testInterceptor);
}

需要注意的是,注解@EnableWebMvc不能丢失。

如果需要拦截特定的URL,可以使用addPathPatterns()方法。如果需要不拦截URL,可以使用excludePathPatterns()。

然后,介绍一下如何使用注解声明一个过滤器。

注解的方式很简单,就是使用@WebFilter,主要的代码如下:

@WebFilter(filterName = "testContext", urlPatterns = "/")
public class TestFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse res = (HttpServletResponse) servletResponse;
        //此处可以加入自定义控制
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

需要注意的是:

1. 必须在启动类增加注解:@ServletComponentScan,方可注册生效。

2. 按照Filter的类名排序。

最后,如果想自定义Filter的生效顺序,可以使用FilterRegistrationBean。

主要的代码如下:

@Bean
public FilterRegistrationBean testFilter(ErrorPageFilter filter) {
    FilterRegistrationBean<TestFilter> filterRegistrationBean = new FilterRegistrationBean<>();
    filterRegistrationBean.setFilter(new TestFilter());
    filterRegistrationBean.setEnabled(true);
    filterRegistrationBean.addUrlPatterns("/");
    filterRegistrationBean.setOrder(1);
    return filterRegistrationBean;
}

如果文中有误,欢迎指正。

觉的不错?可以关注我的公众号↑↑↑

给我留言

Copyright © 字痕随行 保留所有权利.   Theme  Ality

用户登录

分享到: