簡體   English   中英

在 Spring 雲網關 api 如何添加動態標頭或查詢參數?

[英]In Spring cloud gateway api how add dynamic headers or query parameter?

我正在開發使用 spring 雲網關和前端 Angular 2 的應用程序,登錄時我使用 Keyclock SSO,但登錄后我需要通過以下方式以某種加密格式在前端發送一些用戶信息標頭或查詢參數,因此在 spring 雲網關中,我已經編寫了下面的代碼,但它不起作用,請幫忙。

這是我的自定義 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 或查詢參數?

如果它可以幫助任何人添加動態查詢參數和重定向頁面,您可以使用以下代碼來完成:

@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));
       });
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM