龙空技术网

详细介绍一下在Spring Boot 如何使用拦截器?

从程序员到架构师 127

前言:

而今兄弟们对“拦截器返回false”大体比较关怀,看官们都想要学习一些“拦截器返回false”的相关文章。那么小编同时在网上收集了一些有关“拦截器返回false””的相关文章,希望我们能喜欢,朋友们一起来了解一下吧!

拦截器是在Spring Boot中的用于拦截HTTP请求的组件,可以在请求到达Controller之前或者是在请求处理完成之后执行对于请求的自定义处理逻辑,它在HTTP请求处理流程中扮演者非常重要的角色,我们可以通过拦截器实现日志记录、认证授权、请求数据统计等功能。下面我们就来详细介绍一下如何在Spring Boot中使用拦截器。

什么是拦截器?

在Spring框架中,我们可以通过HandlerInterceptor接口来定义一个拦截器,在这个接口中定义了如下的三个方法用来执行请求拦截操作。

preHandle:在请求到达控制器之前执行。postHandle:在请求处理之后、视图渲染之前执行。afterCompletion:在请求完成之后执行,通常用于资源清理等操作。

拦截器在Spring Boot中是属于一种拦截器型的处理器,是面向Handler的处理,所以可以对Controller层的请求进行拦截。

实现拦截器

创建拦截器类

首先我们需要继承HandlerInterceptor接口来实现一个拦截器类,通过重写这个接口中的三个方法来实现对于请求逻辑的不同处理,如下所示。

@Componentpublic class MyInterceptor implements HandlerInterceptor {    // 在Controller方法调用之前执行    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        System.out.println("Pre Handle method is Calling");        // 返回true放行,返回false中止请求        return true;    }    // 在Controller方法调用之后执行    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        System.out.println("Post Handle method is Calling");    }    // 在请求完成后调用,即视图渲染完成后    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception {        System.out.println("Request and Response is completed");    }}

preHandle()方法

该方法在请求到达Controller之前调用,我们可以在这个方法中来进行用户是否登录、是否授权等操作的处理,这个方法返回true就表示放行请求,而返回false则表示需要拦截该请求。

postHandle()方法

这个方法用于在Controller请求之后进行处理,通常在视图操作渲染之前执行,也就是说可以对ModelAndView进行操作处理。

afterCompletion()方法

该方法在请求完成后执行,通常用于进行资源清理等操作。

配置拦截器

在创建好拦截器类之后,想要使用拦截器,就需要在Spring Boot应用中注册拦截器。一般情况下,我们可以创建一个实现WebMvcConfigurer接口的配置类来完成拦截器的配置,如下所示。

@Configurationpublic class WebConfig implements WebMvcConfigurer {    @Autowired    private MyInterceptor myInterceptor;    @Override    public void addInterceptors(InterceptorRegistry registry) {        // 注册自定义拦截器并指定拦截路径        registry.addInterceptor(myInterceptor)                .addPathPatterns("/**")    // 拦截所有请求                .excludePathPatterns("/login", "/register");  // 排除登录和注册路径    }}

这样,我们的MyInterceptor拦截器就会生效,除了/login和/register路径请求之外,会拦截所有的其他请求处理。

注意事项

拦截器执行顺序

在遇到多个拦截器的时候,这些拦截器是按照一定的顺序来进行操作的,如果需要调整这些拦截器的执行顺序可以通过调整addInterceptor的顺序来实现。

HandlerInterceptor和Filter的区别

虽然Filter和HandlerInterceptor都可以用于请求拦截,但Filter是Servlet层面的拦截,更底层。而HandlerInterceptor则是Spring MVC层面的,专门拦截Controller相关的请求。

链式拦截器

在SpringBoot中拦截器会形成一个链式调用结构,也就是说只有当前一个拦截器preHandle方法返回true才会继续执行下一个拦截器操作。

总结

在Spring Boot中拦截器是一个非常实用的操作,它可以帮助我们在不修改Controller代码的情况下对请求进行一些通用的操作,通过自定义的拦截器我们还可以完成一些自定义的扩展功能,例如对于请求日志的记录,对于用户权限的验证、对于用户调用信息的采集等等操作。

在实际开发中,我们可以根据具体的需求来组合拦截器和过滤器,这样我们可以灵活的实现多种的请求拦截功能。

标签: #拦截器返回false