统一功能处理----拦截器

拦截器

拦截器是Spring框架提供的核心功能之一,主要用来拦截用户的请求,在指定方法前后,根据业务需要执行预先设定的代码。

拦截器就像小区门口的保安一样,当有人(外部请求)想要进入小区,保安就会先验证他的身份,身份正确才会放行;再你出小区后会做一些善后工作(如:关门......)。

拦截器的使用分为两步:

  • 定义拦截器
  • 注册配置拦截器路径

HandlerInterceptor

自定义拦截器需要使其实现HandlerInterceptor接口并重写里面的方法。

java 复制代码
public class Interceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

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

preHandle: 该方法会在目标接口执行前执行。返回true表示继续执行后续操作;返回false表示拦截当前请求并中断后续操作;

postHandle:该方法会在目标接口执行后执行;

afterCompletion:该方法会在视图渲染完毕后执行,最后执行(因为后端开发现在几乎不涉及视图所以使用较少)。

WebMvcConfigurer

当我们实现了自定义拦截器后还需要注册配置拦截器路径,需要再创建一个类并令其实现WebMvcConfigurer接口,并重写addInterceptors方法,将我们自定义的拦截器交给Spring来管理,令Spring来决定执行实机;

java 复制代码
@Configuration
public class Configurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //添加自定义拦截器
        registry.addInterceptor(new Interceptor());
    }
}

当我们添加完拦截器后还需要配置拦截器路径,让拦截器对特定的方法生效,而另一些方法中不生效。

java 复制代码
@Configuration
public class Configurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new Interceptor())
            //配置拦截器生效的路径(对所有路径都生效)
                .addPathPatterns("/**");
    }
}

|------------|--------------|---------------------------------------------------------|
| 拦截路径 | 含义 | 举例 |
| /* | ⼀级路径 | 能匹配/user,/book,/login,不能匹配/user/login |
| /** | 任意级路径 | 能匹配/user,/user/login,/user/reg |
| /book/* | /book下的⼀级路径 | 能匹配/book/addBook,不能匹配/book/addBook/1,/book |
| /book/** | /book下的任意级路径 | 能匹配/book,/book/addBook,/book/addBook/2,不能匹 配/user/login |


我们定义如下的拦截器,并编写两个方法(fun1,fun2):

java 复制代码
@Slf4j
public class Interceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("目标方法执行前");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("目标方法执行后");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("视图渲染完毕后");
    }
}
java 复制代码
@Slf4j
@RestController
@RequestMapping("/test")
public class Test {

    @RequestMapping("/fun1")
    public void fun1() {
        log.info("执行fun1方法");
    }

    @RequestMapping("/fun2")
    public void fun2() {
        log.info("执行fun2方法");
    }
}

修改配置路径令其对fun1方法不生效

java 复制代码
@Configuration
public class Configurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new Interceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/test/fun1");
    }
}
相关推荐
JH30731 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
m0_736919102 小时前
C++代码风格检查工具
开发语言·c++·算法
Coder_Boy_2 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
2501_944934732 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
invicinble2 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟3 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖3 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
2301_763472463 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
TechWJ4 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto
qq_12498707534 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计