微服务注册拦截器的配置类为什么要加@ConditionalOnClass(DispatcherServlet.class)注解

微服务注册拦截器的配置类为什么要加@ConditionalOnClass(DispatcherServlet.class)注解

@Configuration
@ConditionalOnClass(DispatcherServlet.class)
public class MvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new UserInfoInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/search/**", "/users/login","/items/**");
    }
}

如果不加这个注解,会引起ClassNotFoundException 或 Bean 错误:由于网关微服务可能并不包含 Spring MVC(没有 DispatcherServlet,尝试注册与 DispatcherServlet 相关的组件时可能会引发 ClassNotFoundException 或类似的错误。也有可能在初始化时出现一些与 Spring MVC 相关的配置或依赖问题,导致启动失败。

根本原因:Spring Cloud Gateway 是基于 Spring WebFlux 的,这意味着它使用的是 Netty 或其他 WebFlux 的服务器,而不是传统的 Tomcat 或 Jetty,而拦截器是Spring MVC的组件,所以Spring MVC 的特性(如 @Controller, @RequestMapping, HandlerInterceptor 等)不会生效

因为在这个项目中,网关服务也是有Spring MVC的依赖,网关这个module也会去注册拦截器,所以要加上@ConditionalOnClass(DispatcherServlet.class)注解,因为DispatcherServlet是Spring MVC的核心类,只有当DispatcherServlet存在时候,才注册拦截器

interceptor不是直接被Spring管理,而是交由SpringMvc进行管理

说说Spring Cloud五大组件?
  1. 服务注册与发现:Nacos 用于管理微服务的注册与发现 (当服务启动时,会将自己注册到 Nacos 服务注册中心,其他服务可以通过 Nacos 查找到它并进行调用。服务的健康状态也可以由 Nacos 来监控。)
  2. 客户端负载均衡:Spring Cloud LoadBalancer 实现了客户端负载均衡,通过不同的负载均衡策略来分发请求,减轻服务端的负担。
  3. 服务调用:OpenFeign 是一种声明式的 HTTP 客户端,可以方便地调用其他微服务,简化了服务间通信的实现。
  4. 熔断器:Sentinel 提供流量控制、熔断、降级等功能,确保在服务过载或故障时,系统能够自我保护,保障系统稳定(避免服务雪崩)。
  5. 网关:Spring Cloud Gateway 提供路由和过滤器功能,充当微服务之间的统一入口,支持请求路由、负载均衡、用户身份鉴权等功能。
你们项目网关用什么实现,实现了什么功能?

我们项目使用Spring Cloud gateway实现网关。

1.请求路由,根据请求路径将请求转发到不同的应用服务器。(从8080端口转到不同的服务器不同的端口)

2.负载均衡,通过负载均衡算法将请求转发到不同的应用服务器。

- id: product
  uri: lb://item-service(lb代表负载均衡)
  predicates:
    - Path=/product/**
  filters:

3.用户身份鉴权,校验用户身份及用户的权限。

网关鉴权怎么实现的?

(Authentication)

用户请求认证服务进行登录,认证成功向前端返回token

前端携带token请求网关

网关通过过滤器(GlobalFilter)拦截请求,获取token

解析token拿到用户信息,如果token合法则继续,否则拒绝访问

网关将用户信息放在http头中转发到微服务

微服务通过拦截器获取用户信息并写入Threadlocal中方便在service方法获取当前用户信息

微服务之间远程调用使用内部无状态接口(内部接口:不通过网关,仅限微服务之间调用,无状态接口:不携带用户信息,本项目直接重写方法,把用户信息当参数传给要调用的微服务,比如用户下单模块)

(Authorization)

用户的权限校验我们是在微服务中进行的,微服务通过Spring security进行权限判断,具体是在controller方法上添加@PreAuthorize注解,在注解中指定该方法对应的权限字符串,用户拥有此权限则继续访问该方法,否则拒绝访问此方法。

若依框架的鉴权

(Authentication)

用户登录时的校验

1.校验验证码,根据传入的uuid去redis拿到验证码进行校验

2.把用户名和密码装入Spring Security里面的AuthenticationToken这个类,再用manager进行校验,AutenticationManager里面会自定义验证逻辑和密码加密规则,验证完成之后会把所有数据都存回Authentication,然后把Authentication对象保存在securityContext中间,随时可以拿到Authentication对象

3.最后返回一个token

其他请求

1.SpringSecurity进行过滤,不需要校验的请求和静态资源

2.token校验,成功就放行

3.登录后会把权限信息存在redis,(权限控制获得基于RABC理论)前后端一起校验权限v-hasRole,@PreAuthorize写在controller层上校验权限

posted @ 2025-03-18 21:37  大花生加瓦  阅读(14)  评论(0)    收藏  举报