首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Java EE进阶 --- SpringBoot】统一功能处理(拦截器)

【Java EE进阶 --- SpringBoot】统一功能处理(拦截器)

作者头像
optimistic_chen
发布2026-01-14 20:36:11
发布2026-01-14 20:36:11
1890
举报

什么是拦截器

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

通俗的讲:程序员提前定义的一些逻辑,在用户请求响应前后执行, 这个操作包括很多方面,比如前端发来请求操作时,在服务器响应之前先判断用户有没有登录,如果有就返回响应,如果没有则进行拦截,拒绝响应并给出原因。

在这里插入图片描述
在这里插入图片描述

拦截器的使用

定义拦截器

我们自定义一个拦截器,实现HandlerInterceptor接口

代码语言:javascript
复制
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("preHandle目标为方法执行前");
        
        //这里拦截器进行判断
        
        //true:放行,false:拦截
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("preHandle目标为方法执行后");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("preHandle目标为视图执行后");
    }
}

注册拦截器

定义后,再来注册拦截器,实现WebMvcConfigurer接口,并重写addInterceptors方法

代码语言:javascript
复制
@Configuration
public class WebConfig implements WebMvcConfigurer {
//我们自定义的拦截器对象
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    //注册自定义拦截器对象
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**");//表示拦截所有请求

    }
}

拦截器通过后:

在这里插入图片描述
在这里插入图片描述

拦截器拦截请求:

在这里插入图片描述
在这里插入图片描述

客户端没有得到响应,服务端控制台也拦截了请求。

拦截路径

在完成对拦截器的基本设置后,我们对拦截器还需要通过 addPathPatterns() 方法设置拦截器的拦截路径(要拦截的请求),也可以通过 excludePathPatterns() 方法设置拦截器不拦截的路径(要通过的请求)

代码语言:javascript
复制
registry.addInterceptor(loginInterceptor)
 .addPathPatterns("/**")
 .excludePathPatterns("/user/login");//设置拦截器拦截的请求路径

拦截流程

正常情况下,我们程序直接从controller层去调用接口,但是现在有了拦截器,我们在执行controller层方法前,请求会被拦截器拦截,通过preHandle() 方法的判断返回一个布尔类型的值。 如果返回true,表示此次请求正常执行;反之则拒绝执行。请求中方法执行完毕后,再去执行postHandle()和afterCompletion() 方法,最后返回给客户端。

适配器模式

适配器模式也叫包装模式,可以将一个类的接口转换成我们期望的另一个接口。

简单来说:就说目标类不能直接使用,我们通过重新包装,适配调用方使用,使两个接口能够兼容。

正常情况,两个类可以合作无间,正常兼容

在这里插入图片描述
在这里插入图片描述

但是也有特例,比如车辆上的充电口,部分汽车中的充电口不允许充电线直接使用,需要一个转换器,一侧连接汽车充电口,另一侧连接充电线,最终完成充电。

设配器实现

Target:目标接口,希望能直接使用的接口 Adaptee:适配者,但是与Target不兼容 Adapter:适配器类,此模式的核心通过继承或者引用适配者的对象,把适配者转为目标接口 client:需要使用适配器的对象

举个例子:@Sl4j 注解,我们只需要调用Sl4j的接口就行,不需要知道它是怎么实现的。

代码语言:javascript
复制
//客户端需要使用log4j,那么就使用Sl4j和log4j的适配器(如果之后需要使用其他的api,只需要更换适配器即可)
public class Sl4j{
   public static void main(String[] args){
       Sl4jApi sl4jApi=new Sl4jApiLog4JAdapter(new Log4j());
   }  
}

//Sl4j和log4j的适配器(转换类)
class Slf4jLog4JAdapter implements Slf4jApi{
    private Log4j log4j;
    public Slf4jLog4JAdapter(Log4j log4j) {
        this.log4j = log4j;
    }
    @Override
    public void log(String message) {
        log4j.log4jLog(message);
    }
}

//log4j接口:适配者
class Log4j{
    void log4jLog(String message){
        System.out.println("Log4j打印:"+message);
    }
}

//sl4j接口:目标接口
interface Slf4jApi{
   void log(String message);
}

总的来说:适配器的核心就是:

1. 客户端只关心目标接口(能兼容的接口) 2. 适配器在中间做转换工作 3. 适配者提供实际功能但接口不兼容

注意:适配器模式可以看作⼀种"补偿模式",⽤来补救设计上的缺陷.所以它更多应用在版本升级等场景。

完结撒花!🎉

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是拦截器
  • 拦截器的使用
    • 定义拦截器
    • 注册拦截器
    • 拦截路径
    • 拦截流程
  • 适配器模式
    • 设配器实现
  • 完结撒花!🎉
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档