首页 > 其他分享 >SpringCloud gateway内置过滤器之六

SpringCloud gateway内置过滤器之六

时间:2023-05-06 22:44:25浏览次数:47  
标签:map GatewayFilter producer Map SpringCloud class 之六 hello gateway

1、RequestSize GatewayFilter

当请求大小大于允许的限制时,RequestSize GatewayFilter可以限制请求到达下游服务。过滤器采用maxSize参数。maxSize是`DataSize类型,因此可以将值定义为一个数字,后跟可选的DataUnit后缀,如“KB”或“MB”。字节的默认值为“B”。它是以字节为单位定义的请求的允许大小限制。当请求因大小而被拒绝时,RequestSize GatewayFilter将响应状态设置为413 Payload Too Large(413有效负载太大),并带有额外的标头errorMessage。

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - name: RequestSize
                args:
                  maxSize: 50

设置了请求最大大小是50B。用Postman调用http://localhost:8500/producer/hello,选择一个超过50B的文件上传:

 

可以看到响应错误消息(Request size is larger than permissible limit. Request size is 1.4 kB where permissible limit is 50 B)和响应状态码(413)。

2、SetRequestHostHeader GatewayFilter

SetRequestHostHeader GatewayFilter设置请求Host头。

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - name: SetRequestHostHeader
                args:
                    host: example.org

修改Producer模块的Controller:

@RequestMapping("/hello")
public String hello(String name, HttpServletRequest request, HttpServletResponse response) {
    System.out.println(request.getHeader("Host"));
    return "hello," + name + "," + port;
}

访问http://localhost:8500/producer/hello,从Producer模块控制台看到输出example.org。

3、Modify a Request Body GatewayFilter

可以使用ModifyRequestBody GatewayFilter在网关向下游发送请求体之前对其进行修改。

 

在GatewayServer模块的配置类中加入:

@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {

    return builder.routes()
            .route("rewrite_request_obj", r ->  r.path("/producer/**")
                    .filters(f -> f.stripPrefix(1).modifyRequestBody(String.class, Map.class, MediaType.APPLICATION_JSON_VALUE, (exchange, s) -> {
                        Map<String,Object> map = null;
                        try {
                            System.out.println("value:"+s);
                            map = objectMapper.readValue(s, Map.class);
                        } catch (JsonProcessingException e) {
                            throw new RuntimeException(e);
                        }

                        map.put("sex","男");
                        return Mono.just(map);
                    })).uri("lb://producer")).build();
}

用函数端点的方式配置了ModifyRequestBody GatewayFilter。router id是rewrite_request_obj,当请求url是/producer/**才处理。modifyRequestBody更改了请求体并加了sex=男的字段,并将请求转发到lb://producer。

 

修改Producer模块的Controller:

@RequestMapping("/hello")
public String hello(String name, HttpServletRequest request, HttpServletResponse response, @RequestBody String s) {
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        Map<String,Object> map = objectMapper.readValue(s, Map.class);
        for (Map.Entry<String, Object> stringObjectEntry : map.entrySet()) {
            System.out.println("key:"+stringObjectEntry.getKey()+":value="+stringObjectEntry.getValue());
        }
    } catch (JsonProcessingException e) {
        throw new RuntimeException(e);
    }

    return "hello," + name + "," + port;
}

用Postman调用http://localhost:8500/producer/hello:

 

 

查看Producer控制台:

4、Modify a Response Body GatewayFilter

ModifyResponseBody filter 更改响应体。

 

在GatewayServer模块的配置类中加入:

@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {

    return builder.routes()
            .route("rewrite_request_obj", r ->  r.path("/producer/**")
                    .filters(f -> f.stripPrefix(1).modifyRequestBody(String.class, Map.class, MediaType.APPLICATION_JSON_VALUE, (exchange, s) -> {
                        Map<String,Object> map = null;
                        try {
                            System.out.println("value:"+s);
                            map = objectMapper.readValue(s, Map.class);
                        } catch (JsonProcessingException e) {
                            throw new RuntimeException(e);
                        }

                        map.put("sex","男");
                        return Mono.just(map);
                    }).modifyResponseBody(String.class,String.class,MediaType.APPLICATION_JSON_VALUE,((serverWebExchange, s) -> {
                        return Mono.just(s + ",hello");
                            }))
                    ).uri("lb://producer")).build();
}

modifyResponseBody方法在响应体后面增加了",hello"字符串。用Postman调用http://localhost:8500/producer/hello:
 

 

可以看到结果已修改。

5、Token Relay GatewayFilter

令牌转发是OAuth2使用者充当客户端并将传入令牌转发给资源请求的地方。使用者可以是纯客户端(如SSO应用程序)或资源服务器。要添加依赖org.springframework.boot:spring-boot-starter-oauth2-client.

spring:
  cloud:
    gateway:
      routes:
      - id: resource
        uri: http://localhost:9000
        predicates:
        - Path=/resource
        filters:
        - TokenRelay=

6、默认过滤器

要将过滤器应用于所有路由,可以使用spring.cloud.gateway.default-filters。

spring:
  cloud:
    gateway:
      default-filters:
      - AddResponseHeader=X-Response-Default-Red, Default-Blue
      - PrefixPath=/httpbin

标签:map,GatewayFilter,producer,Map,SpringCloud,class,之六,hello,gateway
From: https://www.cnblogs.com/shigongp/p/17378510.html

相关文章

  • SpringCloud gateway内置过滤器之五
    1、SetRequestHeaderGatewayFilterSetRequestHeaderGatewayFilter设置请求头,会覆盖原来已有的请求头。spring:cloud:gateway:enabled:trueroutes:-id:Goods-Server#路由id,唯一标识uri:lb://producerpredicates......
  • SpringCloud gateway内置过滤器之四
    1、RewriteLocationResponseHeaderGatewayFilterRewriteLocationResponseHeaderGatewayFilter修改Location响应标头的值,通常是为了消除后端特定的详细信息。有stripVersionMode、locationHeaderName、hostValue和protocolsRegex参数。protocolsRegx参数必须是有效的正则表达式......
  • 六、分布式SpringCloud环境--谷粒商城
    分布式SpringCloud环境一、注册中心:SpringCloudAlibabaNacos版本:nacos1.1.3链接:https://github.com/alibaba/nacos/releases?page=4主机端使用:(1)、下载zip,并解压,打开bin里的startup.cmd (2)、引入依赖、修改配置文件:导入nacos配置引入依赖<dependency><grou......
  • 浅谈Protocol Buffers、GRPC、Buf、GRPC-Gateway
    1.ProtocolBuffers什么是proto?ProtocolBuffers如何理解ProtocolBuffers?协议缓冲区非proto协议如何订立、传播以及维护?如何理解协议缓冲区?Protocolbuffers提供了一种语言中立、平台中立、可扩展的机制,用于以向前兼容和向后兼容的方式序列化结构化数据。它......
  • springcloud小应用
    一、Actuator修改Actuator端点前缀management.endpoints.web.base-path=/manage将原来的mappings端点的请求路径修改为urlMappingsmanagement.endpoints.web.path-mapping.mappings=request_mappings暴露部分端点management.endpoints.web.exposure.include=info,health,be......
  • SpringCloud实例
    前言:此文档是跟着课程来的,主要是为了熟悉SpringCloud和kubernetes是怎么结合的,后续用在测试cicd流水线上。1.基础环境1.1.java环境配置jdk1.8链接:下载mkdir-p/usr/local/src/jdk; cd/usr/local/src/jdktar-zxvfjdk-8u221-linux-x64.tar.gz-C/usr/localvim/e......
  • SpringCloud gatewayeFilter之一
    1、AddRequestHeaderGatewayFilterAddRequestHeaderGatewayFilter采用名称和值参数。例如:spring:cloud:gateway:enabled:trueroutes:-id:Goods-Server#路由id,唯一标识uri:lb://producerpredicates:......
  • 【SpringCloud】 Eureka 单机模式
    系统配置信息springboot版本:2.1.6.RELEASEjdk:1.8系统:Windows10工程结构父工程halo-cloud-parent子工程<注册中心>halo-cloud-server子工程<服务消费者>halo-cloud-consumer子工程<服务提供者>halo-cloud-providerhalo-coud-parent依赖引入<!--打......
  • 502 Bad Gateway Nginx
    502BadGatewayNginx页面提示502BadGatewayNginx简单来说,可以检查nginx的配置文件,查看其中的各个ip是否有效,端口是否通着像是我的情况是,数据库密码换了以后,多个应用的配置文件换了,但是漏了一个,然而用户反映是在五一放假结束以后才出现问题,实际上应该是因为数据库连接不上......
  • FICO配置详解之六:产品成本控制
    1.定义成本构成结构功能说明配置路径事务代码:OKTZ路径:IMG>控制>产品成本控制>产品成本计划>物料成本核算的基本设置>定义成本构成结构路径:IMG>控制>产品成本控制>产品成本计划>物料成本核算的基本设置>定义成本构成结构-带有属性的成本组件业务示例配置步骤部分字段说明如下......