基于Springboot下实现过滤器和拦截器

168 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

简介

SpringBoot是Pivotal团队提供的全新框架,其设计目的来简化Spring应用的初始搭建以及开发过程。

springboot的创建

创建一个SpringBoot

我们首先创建一个项目,然后在项目结构中加入Maven,然后选择Spring Initializr,接下来我们选择版本这里我们选择java 8,因为本人是JDK 8,当然有高版本的也可以选择高版本的SpringBoot版本。

做一个实验小Demo

注意,我们刚创建完SpringBoot项目可能会出现Java目录不是蓝色而是灰色的!!!!噫?难道SpringBoot比较独特的设置吗?

我们右键创建一个Class试试,咦?为什么没有创建类这个选项????

原来是我们用idea创建其后会自动把依赖包导入,这也是为什么SpringBoot创立时必须要联网操作,这需要一定的时间,所以此时无法识别文件。

image.png

右下角可以看到进度。

在Springboot中使用拦截器和过滤器

在 Spring Boot 中实现过滤器和拦截器非常简单,只需要实现相应的接口并添加 @Component 注解即可将其作为 Spring 的 Bean 进行管理。

过滤器:

要在 Spring Boot 中实现过滤器,需要实现 javax.servlet.Filter 接口,并重写其中的 doFilter 方法。例如,以下是一个简单的过滤器,用于在处理请求之前打印出当前时间:

@Component
public class ExampleFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        long startTime = System.currentTimeMillis();
        System.out.println("Start Time: " + startTime);

        chain.doFilter(request, response);

        long endTime = System.currentTimeMillis();
        System.out.println("End Time: " + endTime);

        System.out.println("Time Taken: " + (endTime - startTime));
    }
}

拦截器:

要在 Spring Boot 中实现拦截器,需要实现 org.springframework.web.servlet.HandlerInterceptor 接口,并重写其中的 preHandle、postHandle 和 afterCompletion 方法。例如,以下是一个简单的拦截器,用于在处理请求之前打印出当前时间:

@Component
public class ExampleInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        long startTime = System.currentTimeMillis();
        request.setAttribute("startTime", startTime);

        return true;
    }

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

        long startTime = (Long) request.getAttribute("startTime");
        request.removeAttribute("startTime");

        long endTime = System.currentTimeMillis();
        modelAndView.addObject("handlingTime", endTime - startTime);
    }
}

在拦截器中,afterCompletion 方法会在整个请求结束之后,也就是在视图渲染之后调用。这是一个很好的地方,可以用来清理资源或记录一些信息。

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
        throws Exception {
    // ...
}

如果你希望拦截器应用于所有的请求,你需要在你的 Spring Boot 应用中配置拦截器。你可以通过实现 WebMvcConfigurer 接口并重写 addInterceptors 方法来完成这一点。

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private ExampleInterceptor exampleInterceptor;

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

一些小区别

过滤器和拦截器都可以用于对请求进行预处理和后处理,但是它们之间有一些区别:

  • 过滤器位于 Servlet API 层,而拦截器位于 Spring MVC 层。
  • 过滤器可以对所有类型的请求起作用,而拦截器仅限于处理器映射(handler mapping)。
  • 过滤器没有访问控制器的能力,而拦截器可以访问控制器和模型视图对象。