SpringBoot从小白到精通(十)使用Interceptor拦截器

使用Spring Boot开发web项目有个非常重要的组件:拦截器。以前我们在做mvc 项目时也使用到的是filter过滤器也就是拦截器。其实Spring Boot 中的拦截器和SpringMVC中的拦截器也是类似的,只是配置上有些区别。那么下面我们就来看看Spring Boot 是怎么配置拦截器的。

一、拦截器配置
创建InterceptorConfig 拦截器配置类,这个类主要是统一配置管理所有的拦截器。

package com.weiz.config;
import com.weiz.controller.interceptor.TwoInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import com.weiz.controller.interceptor.OneInterceptor;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Resource
    private OneInterceptor myInterceptor1;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //添加要拦截的url                1                 拦截的路径                                    放行的路径
        registry.addInterceptor(myInterceptor1).addPathPatterns("/admin/**").excludePathPatterns("/admin/login");
    }
}

说明:
1、使用注解@Configuration配置拦截器
2、继承WebMvcConfigurer 接口
3、重写addInterceptors方法,添加需要的拦截器地址

二、自定义拦截器
前面创建了拦截器的配置管理类,接下来就应该创建具体的拦截器。首先创建com.weiz.controller.interceptor包,并创建OneInterceptor拦截器。
这个拦截器通过实现 HandlerInterceptor 接口,达到请求拦截的作用。具体代码如下:

package com.weiz.controller.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class OneInterceptor implements HandlerInterceptor  {
    /**
     * 在请求处理之前进行调用(Controller方法调用之前)
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
            Object object) throws Exception {
        
        System.out.println("被OneInterceptor拦截,放行...");
return true;
    }
    
    /**
     * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, 
            Object object, ModelAndView mv)
            throws Exception {
        // TODO Auto-generated method stub
        
    }
    
    /**
     * 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行
     * (主要是用于进行资源清理工作)
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
            Object object, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub
        
    }
}

说明:
1、HandlerInterceptor接口有 3 个拦截方法:

  • preHandle:Controller逻辑执行之前进行拦截
  • postHandle:Controller逻辑执行完毕但是视图解析器还未进行解析之前进行拦截
  • afterCompletion:Controller逻辑和视图解析器执行完毕进行拦截

2、实际开发中 一般preHandle 使用频率比较高,postHandle 和 afterCompletion操作相对比较少。

  • postHandle 是在视图解析前进行拦截,通过 Model 再次添加数据到 Request域中。
  • afterCompletion 暂时没有想到使用场景,如果有使用过的场景可以在下面评论区中进行评论。
    三、验证测试
    在浏览器中,输入配置管理器中拦截的地址:http://localhost:8088/th/index
    image
posted @   lipu123  阅读(65)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
历史上的今天:
2020-01-06 某天向前,向后是几月几号
2020-01-06 简单dp
2020-01-06 A. Angry Students
2020-01-06 小杨排队(dp)
点击右上角即可分享
微信分享提示