• 过滤器:Gateway GlobalFilter在分布式系统中的应用


    在Spring Cloud Gateway中,GlobalFilter接口允许你创建全局过滤器,这意味着该过滤器会应用到所有的路由上,无论它们是否匹配特定的路由规则。Ordered接口用于定义过滤器的执行顺序。

    以下是一个AuthFilter类的示例,该类实现了GlobalFilter和Ordered接口,用于实现一个全局的身份验证过滤器:

    1. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    2. import org.springframework.cloud.gateway.filter.GlobalFilter;
    3. import org.springframework.core.Ordered;
    4. import org.springframework.stereotype.Component;
    5. import org.springframework.web.server.ServerWebExchange;
    6. import reactor.core.publisher.Mono;
    7. @Component
    8. public class AuthFilter implements GlobalFilter, Ordered {
    9. @Override
    10. public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    11. // 在这里实现你的身份验证逻辑
    12. // 可以从exchange中获取请求信息,例如请求头、请求参数等
    13. // 假设我们有一个isAuthenticated方法来判断用户是否已经认证
    14. boolean isAuthenticated = isAuthenticated(exchange);
    15. if (isAuthenticated) {
    16. // 用户已认证,继续执行下一个过滤器
    17. return chain.filter(exchange);
    18. } else {
    19. // 用户未认证,拒绝访问,可以返回一个错误响应
    20. exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
    21. return exchange.getResponse().setComplete();
    22. }
    23. }
    24. // 这是一个假设的方法,你需要根据你的业务逻辑来实现它
    25. private boolean isAuthenticated(ServerWebExchange exchange) {
    26. // 实现你的认证逻辑
    27. // 例如,从请求头中获取token,并验证其有效性
    28. ServerHttpRequest request = exchange.getRequest();
    29. String token = getToken(request);
    30. if (StringUtils.isEmpty(token)) {
    31. return unauthorizedResponse(exchange, "令牌不能为空");
    32. }
    33. // 从令牌中获取数据声明
    34. Claims claims = JwtUtils.parseToken(token);
    35. if (claims == null) {
    36. return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
    37. }
    38. String userid = JwtUtils.getUserId(claims);
    39. String username = JwtUtils.getUserName(claims);
    40. if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username)) {
    41. return unauthorizedResponse(exchange, "令牌验证失败");
    42. }
    43. return true; // 假设用户已认证
    44. }
    45. @Override
    46. public int getOrder() {
    47. // 返回的整数定义了过滤器的执行顺序
    48. // 数字越小,优先级越高,过滤器越早执行
    49. return -1; // 设置较高的优先级,使该过滤器在其他过滤器之前执行
    50. }
    51. }

  • 相关阅读:
    WebRTC源码之音频设备的录制流程源码分析
    Polygon zkEVM的pil-stark Fibonacci状态机代码解析
    KeyDB源码解析二——线程安全
    淘宝/天猫获取卖出的商品订单列表 API
    在Linux中eth0旁边的lo是什么
    c++STL容器(看这一篇就够)
    如何实现基于场景的接口自动化测试用例?来看看大佬的方案
    SCI如何审稿和修稿
    数据库系统原理与应用教程(078)—— MySQL 练习题:操作题 173-180(二十二):综合练习
    TiDB Data Migration 产品简介
  • 原文地址:https://blog.csdn.net/m0_67624967/article/details/136186498