【问题标题】:In Spring Cloud gateway API, how add dynamic headers or query parameter?Spring Cloud gateway API 中,如何添加动态头或查询参数?
【发布时间】:2023-02-18 20:10:42
【问题描述】:

我正在开发使用 Spring Cloud 网关和前端 Angular 2 的应用程序,我使用 Keyclock SSO 进行登录。

但是,登录后,我需要通过标头或查询参数以某种加密格式在前端发送一些用户信息。为此,我在 Spring Cloud 网关中编写了以下代码,但它不起作用。

这是我的自定义 GlobalFilter,我尝试在其中添加标头和参数,但在前端我没有得到它。

@Component
public class InterceptorFilterGatewayFilterFactory extends AbstractGatewayFilterFactory<InterceptorFilterGatewayFilterFactory.Config> {


    public InterceptorFilterGatewayFilterFactory() {
        super(Config.class);
    }
    @Override
    public Config newConfig() {
        return new Config();
    }

    public static class Config {
        private String value;

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }

    @Override
    public GatewayFilter apply(Config config) {

        return (exchange, chain) -> {
            ServerHttpRequest sr = exchange.getRequest();
            Mono var10000 = exchange.getPrincipal().filter((principal) -> principal instanceof OAuth2AuthenticationToken)
                    .map(p -> p).map((p) -> {
                        LinkedHashSet<URI> attr = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR);
                        ServerHttpRequest request = exchange.getRequest();

                      // Here I try to add query parameter

                        MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
                        queryParams.put("e", Collections.singletonList(toHexString(ja.toString().getBytes())));
                      
                        URI newUri = UriComponentsBuilder.fromUri(request.getURI())
                                .replaceQueryParams(unmodifiableMultiValueMap(queryParams))
                                .build(true).toUri();
                        
                        ServerHttpRequest updatedRequest = exchange.getRequest().mutate().uri(newUri)
                                .build();
                       // Here I add header
                        updatedRequest.mutate().header("e", toHexString(ja.toString().getBytes())).build();


                        return exchange.mutate().request(updatedRequest).build();

            }).defaultIfEmpty(exchange).flatMap(chain::filter);

}

        return var10000;
    };
}

在应用程序 yml 文件中,我提供了如下路径:

- id: appDepartmentWise
          predicates:
            - Path=/app/*/sso_login
            - Method=GET,POST
          uri: http://localhost:9000/app/
          filters:
            - PreserveHostHeader
            - RewritePath=/.*, /app/index.html
            - InterceptorFilter
            - AddRequestParameter=e,*

缺少什么配置,如何添加动态 Header 或 Query Parameters?

【问题讨论】:

    标签: java spring spring-boot spring-cloud spring-cloud-gateway


    【解决方案1】:

    如果它可以帮助任何人添加动态查询参数和重定向页面,您可以使用以下代码来完成:

    @GetMapping("/user")
    public Mono<Void> sendRedirect(ServerWebExchange exchange, Principal p) {
    
           // Here we can can create string which can have dynamic parameters
           String responseData = "e="+p..getName();
    
           return Mono.fromRunnable(() -> {
               ServerHttpResponse response = exchange.getResponse();
               response.setStatusCode(HttpStatus.FOUND);
    
            // this used to get the base URL.
    
               UriComponents uriComponents = UriComponentsBuilder.fromUri(exchange.getRequest().getURI()).replacePath(exchange.getRequest().getPath().contextPath().value()).replaceQuery((String)null).fragment((String)null).build();
    
    // As below we can re-generate the URL and redirect it.
               response.getHeaders().setLocation(URI.create(uriComponents.toUriString()+"/app/Dept"+"/sso_login?"+responseData));
           });
       }
    

    【讨论】:

      猜你喜欢
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 2019-05-01
      • 2018-09-25
      • 2019-12-30
      • 2019-11-06
      • 1970-01-01
      相关资源
      最近更新 更多