• 25.gateway的Filter 过滤器工厂(springcloud)


    1 概述
    gateway 里面的过滤器和 Servlet 里面的过滤器,功能差不多,路由过滤器可以用于修改进入Http 请求和返回 Http 响应
    2 分类
    2.1 按生命周期分两种
    pre 在业务逻辑之前
    post 在业务逻辑之后
    2.2 按种类分也是两种

    GatewayFilter 需要配置某个路由,才能过滤。如果需要使用全局路由,需要配置 Default Filters。

    GlobalFilter 全局过滤器,不需要配置路由,系统初始化作用到所有路由上
    全局过滤器 统计请求次数 限流 token 的校验 ip 黑名单拦截 跨域本质 (filter)
    144 开头的电话 限制一些 ip 的访问
    3 官方文档查看过滤器
    3.1 单一过滤器( 31 个)
    https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/
    html/#gatewayfilter-factories

     

    3.2 全局过滤器(9 个)

     

     4 自定义网关过滤器(重点)

    4.1 自定义全局过滤器
    全局过滤器的优点的初始化时默认挂到所有路由上,我们可以使用它来完成 IP 过滤,限流等功能
    4.2 创建配置类MyGlobalFilter
    1. package com.it.filter;
    2. import com.fasterxml.jackson.databind.ObjectMapper;
    3. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    4. import org.springframework.cloud.gateway.filter.GlobalFilter;
    5. import org.springframework.core.Ordered;
    6. import org.springframework.core.io.buffer.DataBuffer;
    7. import org.springframework.http.HttpHeaders;
    8. import org.springframework.http.HttpStatus;
    9. import org.springframework.http.server.reactive.ServerHttpRequest;
    10. import org.springframework.http.server.reactive.ServerHttpResponse;
    11. import org.springframework.stereotype.Component;
    12. import org.springframework.web.server.ServerWebExchange;
    13. import reactor.core.publisher.Mono;
    14. import java.net.URI;
    15. import java.util.HashMap;
    16. /**
    17. * 定义了一个过滤器,
    18. * 需要给该过滤器指定执行顺序,通常一个项目中有多个过滤器,组成过滤器的责任链模式。
    19. */
    20. @Component
    21. public class MyGlobalFilter implements GlobalFilter, Ordered {
    22. /**
    23. * 这个就是全部过滤的方法
    24. * 常用责任链模式
    25. * @param exchange
    26. * @param chain
    27. * @return
    28. */
    29. @lombok.SneakyThrows
    30. @Override
    31. public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    32. //针对请求的过滤,拿到请求 header url 参数
    33. ServerHttpRequest request = exchange.getRequest();
    34. String uri = request.getURI().getPath();
    35. System.out.println(uri);
    36. HttpHeaders headers = request.getHeaders();
    37. System.out.println(headers);
    38. String name = request.getMethod().name();
    39. System.out.println(name);
    40. String hostName = request.getRemoteAddress().getHostName();
    41. System.out.println(hostName);
    42. //响应相关的
    43. ServerHttpResponse response = exchange.getResponse();
    44. //放行,转入下一个过滤器
    45. // return chain.filter(exchange);
    46. //不放行
    47. response.getHeaders().set("content-type","application/json;charset=utf-8");
    48. //组装业务返回值
    49. HashMap map = new HashMap<>();
    50. map.put("code", HttpStatus.UNAUTHORIZED.value());
    51. map.put("msg","你未授权!");
    52. ObjectMapper objectMapper = new ObjectMapper();
    53. //因为返回类型为Mono,所以需要把map转换成一个字节
    54. byte[] bytes = objectMapper.writeValueAsBytes(objectMapper);
    55. //通过buffer工厂将字节数组包装成一个数据包
    56. DataBuffer wrap = response.bufferFactory().wrap(bytes);
    57. return response.writeWith(Mono.just(wrap));
    58. }
    59. /**
    60. * 指定过滤器执行顺序的方法
    61. * 越小越先执行
    62. * @return
    63. */
    64. @Override
    65. public int getOrder() {
    66. return -1;
    67. }
    68. }

  • 相关阅读:
    MySQL之账号管理、建库以及四大引擎+案例
    RNA-seq——三、使用Hisat2进行序列比对
    CleanMyMac X果粉装机必备电脑优化工具性能提升X倍
    设计模式-六大设计原则
    内存与IO访问函数实例
    SpringBoot项目本机和Linux环境部署
    C# 实验一
    【机器人算法】机器人运动学参数辨识/DH参数校准/DH参数辨识
    leetcode:1838. 最高频元素的频数【排序 + 前缀和 + 二分 + 思维】
    130家小程序,“火”的一塌糊涂
  • 原文地址:https://blog.csdn.net/weixin_59334478/article/details/127872917