• 过滤器: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. }

  • 相关阅读:
    展开说说:Android之SharedPreferences
    技术面试与HR面:两者之间的关联与区别
    字符编码转换时发生内存越界引发的摄像头切换失败问题的排查
    计及需求响应的粒子群算法求解风能、光伏、柴油机、储能容量优化配置(Matlab代码实现)
    Spark集成ClickHouse(笔记)
    redis 学习指南
    关于 Vue3 响应式 API 以及 reactive 和 ref 的用法
    React小记(一)_基础部分
    汽车螺丝扭力标准/汽车常见螺栓扭矩参照
    【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
  • 原文地址:https://blog.csdn.net/m0_67624967/article/details/136186498