SpringBoot 拦截器(Interceptor)的使用

本文深入讲解了Spring MVC中拦截器Interceptor的使用方法,包括自定义拦截器的步骤、继承HandlerInterceptor及实现preHandle方法等内容,并提供了注册拦截器的具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拦截器intercprot  和 过滤器 Filter 其实作用类似

在最开始接触java 使用struts2的时候,里面都是filter

后来springmvc时就用interceptor

没太在意过区别,反正就是起检查作用的,

仔细阅读 过滤器(filter)和拦截器(interceptor)的区别 后明白了不少

最重要的要记住他们的执行顺序: 先filter 后 interceptor

过滤前-拦截前-action执行-拦截后-过滤后

 

在了解上面的信息后,本文讲interceptor的使用

自己定义的interceptor都需要继承HandlerInterceptor 并实现对应方法preHandle   postHandle来实现拦截功能

同时需要根据拦截规则进行注册

实例如下:

复制代码
package com.xiao.config;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.alibaba.fastjson.JSON;
import com.xiao.common.result.Error;
import com.xiao.common.result.Result;

@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {

@Bean
public InterfaceAuthCheckInterceptor getInterfaceAuthCheckInterceptor() {
    return new InterfaceAuthCheckInterceptor();
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
    // 多个拦截器组成一个拦截器链
    // addPathPatterns 用于添加拦截规则
    // excludePathPatterns 用户排除拦截
    registry.addInterceptor(getInterfaceAuthCheckInterceptor()).addPathPatterns("/api/**");
    // registry.addInterceptor(new InterfaceAuthCheckInterceptor()).addPathPatterns("/api/**");
    // 如果interceptor中不注入redis或其他项目可以直接new,否则请使用上面这种方式
    super.addInterceptors(registry);
}


/**
 * 微服务间接口访问密钥验证
 * @author xiaochangwei
 *
 */
class InterfaceAuthCheckInterceptor implements HandlerInterceptor {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {

    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {

    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj)
            throws Exception {
        String key = request.getParameter("key");
        if (StringUtils.isEmpty(key)) {
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(JSON.toJSONString(new Result(Error.INCOMPLETE_API_AUTHEN_INFO.getCode(), Error.INCOMPLETE_API_AUTHEN_INFO.getMessage())));
            return false;
        } else {
            logger.info("test redis import :" + stringRedisTemplate.opsForValue().get(key));
            // TODO 验证逻辑
            return true;
        }
    }

}

}

复制代码

其中要注意注册时的区别

registry.addInterceptor(getInterfaceAuthCheckInterceptor()).addPathPatterns("/api/**"); 这种方式无论什么情况都可以

registry.addInterceptor(new InterfaceAuthCheckInterceptor()).addPathPatterns("/api/**");这种情况时,自定义的interceptor中不能注入其他内容,比如redis或者其他service,如果要注入,必须使用上面这种方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值