网关入门(五)网关传递用户和自定义拦截器

网关传递用户
如何传递用户
使用自定义拦截器拦截请求
java 复制代码
// 传递用户到下游服务 【保存在header里面】
String userinfo = userId.toString();
exchange.mutate()
        .request(builder -> builder.header("user-info", userinfo))
        .build();
return chain.filter(exchange);

注意:这个拦截在其他的服务里面使用,可以将其封装到hm-common里面

1、hm-common模块文件目录结构 2、封装拦截器

java 复制代码
package com.hmall.common.interceptor;

import cn.hutool.core.util.StrUtil;
import com.hmall.common.utils.UserContext;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UserInfoInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String userInfo = request.getHeader("user-info"); // user-info
        System.out.println("userInfo:::" + userInfo);
        if(StrUtil.isNotBlank(userInfo)){
            UserContext.setUser(Long.valueOf(userInfo));
        }
        return true;
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        UserContext.removeUser();
    }
}

3、拦截器的注册

注意拦截器需要注册才能使用,创建一个配置类继承WebMvcConfigurer,注入拦截器

java 复制代码
package com.hmall.common.config;

import com.hmall.common.interceptor.UserInfoInterceptor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@ConditionalOnClass(DispatcherServlet.class)
public class MvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new UserInfoInterceptor());
    }
}

4、将拦截器实现装配

在src/main/resources/META-INF/spring.factories 问价下面进行配置。

yaml 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.hmall.common.config.MyBatisConfig,\
  com.hmall.common.config.JsonConfig,\
  com.hmall.common.config.MvcConfig

认识spring.factories文件

spring.factories 是一个标准的Spring Framework配置文件,它用于指定Spring应用程序中要加载的类或配置的位置。

具体来说,spring.factories 文件通常用于以下两个目的:

  1. 自动装配(Auto-Configuration):在Spring Boot应用程序中,可以使用 spring.factories 配置文件来实现自动配置。该文件中列出了要自动配置的类的全限定名,当应用程序启动时,Spring Boot会根据这些类来自动配置一些默认的行为和特性。这样可以减少手动配置的工作量,并提高开发效率。
  2. 插件扩展:某些框架或库支持使用 spring.factories 文件来定义扩展点。通过在该文件中列出实现了特定接口或抽象类的类,框架或库可以自动发现并加载这些扩展,以提供额外的功能或定制化选项。

总结,src/main/resources/META-INF/spring.factories 是一个用于配置Spring应用程序中自动装配和插件扩展的重要文件。在具体的项目中,其作用和用途可能有所不同,具体要根据使用的框架或库来确定。

5、拦截器使用截图

yaml 复制代码
userInfo:::3
UserContext.getUser() 购物车。。。。。= 3
相关推荐
橙序员小站4 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
怒放吧德德4 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆6 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
开心就好20257 小时前
UniApp开发应用多平台上架全流程:H5小程序iOS和Android
后端·ios
悟空码字7 小时前
告别“屎山代码”:AI 代码整洁器让老项目重获新生
后端·aigc·ai编程
小码哥_常7 小时前
大厂不宠@Transactional,背后藏着啥秘密?
后端
奋斗小强7 小时前
内存危机突围战:从原理辨析到线上实战,彻底搞懂 OOM 与内存泄漏
后端
小码哥_常8 小时前
Spring Boot接口防抖秘籍:告别“手抖”,守护数据一致性
后端
心之语歌8 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
None3218 小时前
【NestJs】基于Redlock装饰器分布式锁设计与实现
后端·node.js