SpringBoot 拦截器(Interceptor)的使用

拦截器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,如果要注入,必须使用上面这种方法

原文地址:https://www.cnblogs.com/sjqq/p/10160590.html

时间: 2024-10-09 02:04:37

SpringBoot 拦截器(Interceptor)的使用的相关文章

Flume-NG源码阅读之SourceRunner,及选择器selector和拦截器interceptor的执行

在AbstractConfigurationProvider类中loadSources方法会将所有的source进行封装成SourceRunner放到了Map<String, SourceRunner> sourceRunnerMap之中.相关代码如下: 1 Map<String, String> selectorConfig = context.getSubProperties( 2 BasicConfigurationConstants.CONFIG_SOURCE_CHANNE

Kafka producer拦截器(interceptor)

Producer拦截器(interceptor)是个相当新的功能,它和consumer端interceptor是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制逻辑. 对于producer而言,interceptor使得用户在消息发送前以及producer回调逻辑前有机会对消息做一些定制化需求,比如修改消息等.同时,producer允许用户指定多个interceptor按序作用于同一条消息从而形成一个拦截链(interceptor chain).Intercetpor

详述 Spring MVC 框架中拦截器 Interceptor 的使用方法

1 前言 昨天新接了一个需要,"拦截 XXX,然后 OOO",好吧,说白了就是要用拦截器干点事(实现一个具体的功能).之前,也在网络上搜了很多关于Interceptor的文章,但感觉内容都大同小异,而且知识点零零散散,不太方便阅读.因此,正好借此机会,整理一篇关于拦截器的文章,在此分享给大家,以供大家参考阅读. 2 拦截器 2.1 概念 Java 里的拦截器是动态拦截 action 调用的对象.它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也可以在一个

struts2拦截器interceptor的三种配置方法

struts2拦截器interceptor的三种配置方法方法1. 普通配置法 <struts>     <package name="struts2" extends="struts-default">         <interceptors>             <interceptor name="myInterceptor" class="edu.hust.interceptor.

Struts拦截器Interceptor

Struts2 拦截器 [Interceptor] 拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部.拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作. 每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面. 如何自定义一个拦截器? 自定义一个拦截器需要三步: 1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类. 2 在strutx.xml中

SpringBoot拦截器中service或者redis注入为空的问题

原文:https://my.oschina.net/u/1790105/blog/1490098 这两天遇到SpringBoot拦截器中Bean无法注入问题.下面介绍我的思考过程和解决过程: 1.由于其他bean在service,controller层注入一点问题也没有,开始根本没意识到Bean无法注入是在拦截器中无效的问题,一直在查找注解指定的包在哪里配置的,然而却找不到配置,Springboot是用java类的形式加载配置的.在网络的某个角落看到这样的说法: SpringBoot项目的Bea

SpringBoot拦截器中Bean无法注入(转)

这两天遇到SpringBoot拦截器中Bean无法注入问题.下面介绍我的思考过程和解决过程: 1.由于其他bean在service,controller层注入一点问题也没有,开始根本没意识到Bean无法注入是在拦截器中无效的问题,一直在查找注解指定的包在哪里配置的,然而却找不到配置,Springboot是用java类的形式加载配置的.在网络的某个角落看到这样的说法: SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描!"Application类&

Flume 拦截器(interceptor)详解

flume 拦截器(interceptor)1.flume拦截器介绍拦截器是简单的插件式组件,设置在source和channel之间.source接收到的事件event,在写入channel之前,拦截器都可以进行转换或者删除这些事件.每个拦截器只处理同一个source接收到的事件.可以自定义拦截器.2.flume内置的拦截器 2.1 时间戳拦截器flume中一个最经常使用的拦截器 ,该拦截器的作用是将时间戳插入到flume的事件报头中.如果不使用任何拦截器,flume接受到的只有message.

springboot 拦截器与servlet的过滤器

springboot 是spring框架的二次升华,简化了配置,提高了开发效率.拦截器是spring 提供的基于AOP思想的实现.过滤器filter是servlet的API,比较依赖servlet,他们有不同也有一些相似的地方. 1Filter基于servlet ,主要用于servlet存在的环境.拦截器用于servlet,也可以用于其他环境中. 2Filter是servlet规范来提供支持,拦截器是spring框架来提供支持. 3Filter的使用主要在servlet的前后,拦截器可以深入到每