当前位置: 首页 > 知识库问答 >
问题:

Spring云网关:如何将params传递给自定义过滤器

曹泉
2023-03-14
application.yml ---

spring:
  cloud:
    gateway:
      routes:
      - id: test_route
        uri: https://api.rangon.pi
        predicates:
        - Path=/api/staticdata/rattlefeed*
        filters:
        - AddRequestHeader=X-Y-Host, rangon
        - TestGatewayFilter=admin, XY8382, basic

//有什么方法可以在我的自定义过滤器类中获得“admin,XY8382,basic”

我的筛选器类

@Component
public class TestGatewayFilter implements 
   GatewayFilterFactory<TestGatewayFilter.Config> {

     @Override
     public GatewayFilter apply(Config config) {
         // grab configuration from Config object

         return (exchange, chain) -> {
             Route r = (Route) exchange.getAttributes().get(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);

             Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
            // ServerWebExchange route =
            // exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
            // List<GatewayFilter> list = r.getFilters();

            GatewayFilter gwf = r.getFilters().get(r.getFilters().size() - 1);

            Builder builder = exchange.getRequest().mutate();
            // use builder to manipulate the request

            return chain.filter(exchange.mutate().build());
        };
    }

    public Config newConfig() {

        Config c = new Config();
        return c;
    }

    public static class Config {
        // Put the configuration properties for your filter here

    }

} 

共有1个答案

杜苏燕
2023-03-14

有两种方法可以在配置文件中定义过滤器的参数,在本例中,我将使用application.yml

首先,可以使用args关键字定义参数的键值列表:

spring:
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: https://myapi.com
          filters:
            - name: TestLoggingFilter
              args:
                value: ThisIsATest

第二种形式是使用内联ARG:

spring:
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: https://myapi.com
          filters:
            - TestLoggingFilter=ThisIsATest
package com.es.filter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.List;

@Component
public class TestLoggingFilter implements GatewayFilterFactory<TestLoggingFilter.Config> {

    private static final Logger LOG = LoggerFactory.getLogger(TestLoggingFilter.class);

    private static final String VALUE = "value";

    @Override
    public Config newConfig() {
        return new Config();
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Collections.singletonList(VALUE);
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            LOG.info("Filter enabled with value: " + config.value);
            return chain.filter(exchange);
        };
    }

    public static class Config {

        private String value;

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }
}
 类似资料:
  • 我使用的是spring ldap和spring boot starter安全性的组合。我已经配置了基本的设置,但仍在传递用户名和密码以进行身份验证。它总是试图验证应用程序中指定的默认凭据。财产。不管怎样,通过传递登录表单中给出的信誉,是否可以正确地做到这一点。 @覆盖受保护的无效配置(AuthenticationManagerBuilder auth)引发异常{ }

  • 我还在研究spring batch,遇到了一个需要将jobParameter传递给定制bean的场景。作业参数包含文件的路径。 这已经包含在读取器的步骤范围中,这里没有包含。 问题是。当类被实例化时,传递给bean的值是“file:#{jobparameters['path'}/filename”,而不是调用作业时传递的jobParameter的值。这让我很困惑,因为我在multiResource

  • 我是一个相当新的反应,这是一个我正在努力解决的问题。

  • 我正在尝试通过@Autowoe注释将过滤器JWTLoginFilter传递给WebSecurityConfig WebSecurityConfirerAdapter。当JWTLoginFilter尝试从WebSecurityConfig获取Auth验证管理器时,问题就出现了。 当我启动服务器时,我得到这个错误: 描述: 应用程序上下文中某些bean的依赖关系形成一个循环: JWTLoginFilt

  • 我试图调试我的应用程序,但调试器没有击中此代码块。这是我的自定义网关过滤器。 下面是这个过滤器的配置 当尝试发送请求时,此endpoint不会启动调试器或将日志打印到控制台。我在这里错过了什么。谢谢你。 如果我在主应用程序中创建AuthorizationHeaderFilter的bean,如下所示 应用程序在启动时引发此错误 我还为云api网关设置了日志级别来调试,下面是日志