• SpringMVC 学习(九)之拦截器


    目录

    1 拦截器介绍

    2 创建一个拦截器类

    3 配置拦截器


    1 拦截器介绍

            在 SpringMVC 中,拦截器 (Interceptor) 是一种用于拦截 HTTP 请求并在请求处理之前或之后执行自定义逻辑的组件。拦截器可以用于实现以下功能:

    • 权限验证:在请求处理之前进行用户身份验证和授权
    • 日志记录:记录请求的相关信息,如请求路径、参数、处理时间等
    • 异常处理:捕获并处理请求处理过程中抛出的异常
    • 性能监控:统计请求的响应时间、吞吐量等性能指标
    • 数据转换:在请求处理之前或之后对请求或响应的数据进行转换或修改
    • 缓存控制:在请求处理之前检查缓存,决定是否从缓存中获取数据

    从以上功能可以看出,拦截器和过滤器作用很相似,但它们存在一些区别。

    • 层次结构:拦截器是 SpringMVC 框架特有的组件,不依赖 servlet 容器,过滤器是 Web 容器级别的组件,依赖 servlet 容器,可以应用于任何 Web 应用
    • 拦截范围:拦截器只能对 SpringMVC 的请求起作用,而过滤器则可以对几乎所有的请求起作用。拦截器可以获取 Spring 容器中的各个 bean,而过滤器就不行,在拦截器注入一个 service,可以调用业务逻辑
    • 触发时机:拦截器在 SpringMVC 的控制器方法被调用之前或之后触发,可以拦截并处理控制器方法的调用。过滤器在 HTTP 请求到达 Web 服务器之前或之后触发,可以在请求进入应用 (SpringMVC) 之前或响应返回给客户端之前进行处理
    • 调用顺序:过滤器在拦截器之前被调用,它们都可以按照 XML 文件中的配置顺序依次执行或注解 @Order 指定的顺序执行

    2 创建一个拦截器类

            创建一个拦截器类需要实现 HandlerInterceptor 接口,该接口包括三个方法:preHandle、postHandle 和 afterCompletion。在这些方法中,可以编写拦截器的逻辑。

    • preHandle:控制器方法执行之前执行 preHandle(),其 boolean 类型的返回值表示是否拦截或放行,返回 true 表示放行,即调用控制器方法;返回 false 表示拦截,即不调用控制器方法
    • postHandle:控制器方法执行之后,渲染视图之前执行 postHandle()
    • afterComplation:处理完视图和模型数据,渲染视图完毕之后执行 afterComplation()
    1. public class CustomInterceptor implements HandlerInterceptor {
    2. @Override
    3. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    4. // 在处理器执行之前调用
    5. String userName=request.getParameter("userName");
    6. String password = request.getParameter("password");
    7. if (userName==null||password==null){
    8. response.setStatus(500);
    9. response.setContentType("text/html; charset=UTF-8");
    10. response.getWriter().print("参数缺失");
    11. return false;
    12. }
    13. //进行用户校验
    14. if (userName.equals("admin")&&password.equals("admin")){
    15. return true; // 返回true继续执行,返回false中断执行
    16. }else {
    17. response.setStatus(500);
    18. response.setContentType("text/html; charset=UTF-8");
    19. response.getWriter().print("用户名或密码错误");
    20. return false;
    21. }
    22. }
    23. @Override
    24. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    25. // 在处理器执行之后,返回ModelAndView之前调用
    26. }
    27. @Override
    28. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    29. // 在整个请求处理完成后调用
    30. }
    31. }

    3 配置拦截器

    基于注解

    addPathPatterns 用于设置拦截哪些请求,excludePathPatterns 用于设置不拦截哪些请求

    1. @Configuration
    2. public class MvcConfig implements WebMvcConfigurer {
    3. @Autowired
    4. private CustomInterceptor customInterceptor ;
    5. @Override
    6. public void addInterceptors(InterceptorRegistry registry) {
    7. registry.addInterceptor(customInterceptor)
    8. .addPathPatterns("/**")
    9. .excludePathPatterns("/error");
    10. }
    11. }

    基于 XML

    通过 设置需要拦截的请求,通过 设置需要排除的请求,即不需要拦截的请求
    1. <mvc:interceptors>
    2. <mvc:interceptor>
    3. <mvc:mapping path="/**"/>
    4. <mvc:exclude-mapping path="/testRequestEntity"/>
    5. <-- 拦截器类 -->
    6. <bean class="com.example.CustomInterceptor" />
    7. mvc:interceptor>
    8. mvc:interceptors>

    注:对于多个拦截器,前面的拦截器不通过,即 preHandle() 返回 false,中断后续执行。

  • 相关阅读:
    深陷盈利困境,“寒冬”中也要二次递表,北森上市迫切
    SqlServer--get 和 post 请求 http接口
    多分类问题:初试手写数字识别
    three.js之访问几何体数据与几何体的旋转平移
    LayaBox---TypeScript---首次接触遇到的问题
    简述对象、类、类结构、消息、方法的基本概念。
    如何像用自来水一样使用数据库|腾讯云数据库TDSQL-C
    Pytorch-基于RNN的不同语种人名生成模型
    Spring实例化源码解析(一)
    【RocketMQ系列十二】RocketMQ集群核心概念之主从复制&生产者负载均衡策略&消费者负载均衡策略
  • 原文地址:https://blog.csdn.net/zjs246813/article/details/136331150