SpringBoot 拦截器(Interceptor)的使用

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 拦截器intercprot  和 过滤器 Filter 其实作用类似在最开始接触java 使用struts2的时候,里面都是filter后来springmvc时就用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,如果要注入,必须使用上面这种方法
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
Java
SpringBoot中的拦截器 interceptor
SpringBoot中的拦截器 interceptor
16 0
|
Java Spring 容器
SpringBoot中添加拦截器,在拦截器中注入其他类的时候出现空指针异常解决办法
SpringBoot中添加拦截器,在拦截器中注入其他类的时候出现空指针异常解决办法
326 0
|
前端开发 Java 程序员
java SpringBoot登录验证token拦截器
用户访问接口验证,如果用户没有登录,则不让他访问除登录外的任何接口。 实现思路: 1.前端登录,后端创建token(通过JWT这个依赖),返给前端 2.前端访问其他接口,传递token,后端判断token存在以或失效 3.失效或不存在,则返回失效提示,前端根据接口返回的失效提示,让其跳转到登录界面
|
NoSQL 安全 Java
SpringBoot幂等性防重token令牌实现方案(redis+annoation+interceptor实现)
SpringBoot幂等性防重token令牌实现方案(redis+annoation+interceptor实现)
SpringBoot幂等性防重token令牌实现方案(redis+annoation+interceptor实现)
|
NoSQL 前端开发 JavaScript
springBoot+redis实现登入拦截器--系统框架搭建(二)
springBoot+redis实现登入拦截器--系统框架搭建(二)
springBoot+redis实现登入拦截器--系统框架搭建(二)
|
监控 Java Apache
Spring Boot拦截器(Interceptor)详解
Spring Boot拦截器(Interceptor)详解
506 0
Spring Boot拦截器(Interceptor)详解
Java:SpringBoot集成filter过滤器、interceptor拦截器
Java:SpringBoot集成filter过滤器、interceptor拦截器
159 0
Java:SpringBoot集成filter过滤器、interceptor拦截器
|
JSON Java 数据格式
SpringBoot——SpringBoot中使用拦截器
SpringBoot——SpringBoot中使用拦截器
SpringBoot——SpringBoot中使用拦截器
|
SQL Java 数据库连接
Springboot 自定义mybatis 拦截器,实现我们要的扩展
Springboot 自定义mybatis 拦截器,实现我们要的扩展
690 0
Springboot 自定义mybatis 拦截器,实现我们要的扩展
Springboot 使用Filter, 拦截器 执行了两次 问题剖析
Springboot 使用Filter, 拦截器 执行了两次 问题剖析
597 0
Springboot 使用Filter, 拦截器 执行了两次 问题剖析