【SpringCloud】04-Gateway网关登录校验

ops/2024/10/25 0:15:01/

1. 网关请求处理流程

在这里插入图片描述
在这里插入图片描述

2. 网关过滤器

在这里插入图片描述
在这里插入图片描述

3. 网关实现登录校验

java">@Component
// 参数构造器
@RequiredArgsConstructor
public class AuthGlobalFilter implements GlobalFilter, Ordered {private final AuthProperties authProperties;private final JwtTool jwtTool;private final AntPathMatcher antPathMatcher = new AntPathMatcher();@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取requestServerHttpRequest request = exchange.getRequest();// 2.判断是否需要做登录拦截if(isExclude(request.getPath().toString())) {// 放行return chain.filter(exchange);}// 3.获取tokenList<String> authorization = request.getHeaders().get("authorization");String token = null;if(!CollUtils.isEmpty(authorization)) {token = authorization.get(0);}// 4.校验并解析tokenLong userId = null;try {userId = jwtTool.parseToken(token);} catch (UnauthorizedException e) {// 无效,则拦截ServerHttpResponse response = exchange.getResponse();response.setRawStatusCode(401);// 直接拦截return response.setComplete();}// 5.传递信息,写在请求头中// System.out.println("userId: " + userId);String userInfo = userId.toString();ServerWebExchange swe = exchange.mutate().request(builder -> builder.header("user-info", userInfo)).build();// 6.放行return chain.filter(swe);}public boolean isExclude(String path) {for (String excludePath : authProperties.getExcludePaths()) {if (antPathMatcher.match(excludePath, path)) {return true;}}return false;}@Overridepublic int getOrder() {return 0;}
}

4. 服务拦截器

将微服务连接器写在common模块。

  1. 拦截器配置
java">public class UserInfoInterceptor implements HandlerInterceptor{@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1.获取 userIdString userId = request.getHeader("user-info");// 2.是否为空if (StrUtil.isNotBlank(userId)) {UserContext.setUser(Long.valueOf(userId));}return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {UserContext.removeUser();}
}
  1. 注册为Bean
    网关底层不是基于SpringMVC,注入SpringMVC会报错。给MvcConfig注入设置为具有SpringMVC的核心组件DispatcherServlet的类。
java">// 还要被扫描到
@Configuration
@ConditionalOnClass(DispatcherServlet.class)
public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new UserInfoInterceptor());}
}
  1. common模块和微服务不在同一个包下,需要在resources/META-INF/spring.factories下添加文件的路径。
java">org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.hmall.common.config.MyBatisConfig,\com.hmall.common.config.MvcConfig,\com.hmall.common.config.JsonConfig

5. OpenFeign传递用户信息

在这里插入图片描述

微服务之间的相互调用不会经过网关,因此不会保存用户信息。
使用OpenFeign的拦截器。将用户信息写入请求头中。

java">public class DefaultFeignConfig {@Beanpublic Logger.Level feignLogLevel() {return Logger.Level.FULL;}@Beanpublic RequestInterceptor userInfoRequestInterceptor() {return new RequestInterceptor() {@Overridepublic void apply(RequestTemplate requestTemplate) {Long userId = UserContext.getUser();if (userId!=null) {requestTemplate.header("user-info", userId.toString());}}};}
}

http://www.ppmy.cn/ops/128186.html

相关文章

react-intl实现国际化多语言切换

react-intl 是一个用于在 React 应用中实现国际化&#xff08;i18n&#xff09;和本地化&#xff08;l10n&#xff09;的库。它提供了一组组件和 API&#xff0c;用于格式化消息、日期、时间、数字等。以下是如何使用 react-intl 实现国际化和多语言切换的详细步骤。 安装 rea…

Redis-2

Redis存储的是key-value结构的数据&#xff0c;其中key是字符串类型&#xff0c;value有5种常用的数据类型&#xff1a; 字符串string 哈希hash 列表list 集合set 有序集合sorted set / zset

微前端架构及其解决方案对比

微前端架构及其解决方案对比 微前端架构是一种通过将大型前端应用拆分为多个独立的、可单独部署的小型应用的设计模式。随着这种模式的流行&#xff0c;诞生了多种微前端实现方案&#xff0c;每个方案都有其独特的特点和适用场景。以下是常见的微前端解决方案及其优缺点对比&a…

2024最新版Windows平台VSCode通过Cmake开发Qt项目

VSCode配合Cmake可以非常有效的开发Qt项目&#xff0c;因为它提供的Qt插件和Cmake插件具有较好的集成性。(本博客使用的是Qt6和Cmake3)。 首先创建一个空的文件夹。 将下面的插件都安装好 接着ctrlshiftp&#xff0c;选择QConfigure:New Project。 指定项目名称 选择Qt的工具链…

Flutter UI组件库(JUI)

Flutter UI组件库 (JUI) 介绍 您是否正在寻找一种方法来简化Flutter开发过程&#xff0c;并创建美观、一致的用户界面&#xff1f;您的搜索到此为止&#xff01;我们的Flutter UI组件库&#xff08;JUI&#xff09;提供了广泛的预构建、可自定义组件&#xff0c;帮助您快速构建…

wx.navigateTo和wx.reLaunch

wx.navigateTo和wx.reLaunch是微信小程序中两种常用的页面跳转API&#xff0c;它们各自具有独特的功能和使用场景。 区别 页面保留与关闭&#xff1a; wx.navigateTo&#xff1a;保留当前页面&#xff0c;跳转到应用内的某个页面。这意味着用户在浏览过程中可以返回到上一个页…

leetcode-73-矩阵置零

题解&#xff1a; 1、获取矩阵的行数M与列数N&#xff1b; 2、 代码实现&#xff1a;

Python数据分析工具OpenCV用法示例

Python数据分析工具OpenCV是一个强大的计算机视觉库&#xff0c;提供了丰富的图像处理算法和功能&#xff0c;支持多种编程语言&#xff0c;包括Python、C、C#等。以下是OpenCV在Python中的一些常见用法示例&#xff1a; 一、图像读取、显示与保存 读取图像 import cv2 im…