SpringCloudGateWay가 자신의 GateWayFilterFactory를 사용자 정의할 때(exchange,chain)

4257 단어
Spring Cloud Gateway를 볼 때 상위 Gateway Filter apply(C config) 방법을 구현할 때 어떻게 봐도 잘 보이지 않습니다.
package com.quantex.scg;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;

import java.util.List;


public class WsSecurityGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {

    @Override
    public GatewayFilter apply(NameValueConfig config) {
        return (exchange, chain) -> {
            List strings = exchange.getRequest().getHeaders().get(config.getName());
            if (strings!=null){
                ServerHttpRequest request = exchange.getRequest().mutate()
                        .header(config.getName(), strings.get(0))
                        .build();
//                System.out.println("-----------------------------------------");
//                System.out.println(strings.get(0));
                return chain.filter(exchange.mutate().request(request).build());
            }else{
                return chain.filter(exchange);
            }
        };
    }
}

왜 이 함수식의 쓰기 (exchange,chain) -> {} 도대체 이 exchange와chain이 어떻게 왔는지, 전역 변수도 못 봤어. 상속된 부류의 전역 변수가 맞는지 생각해 봤어.나는 겹겹이 찾았지만 찾을 수 없었다. 정말 모르겠다. 나는 용기 위탁 관리인인 exchange와chain이라는 실례가 있는 줄 알고 머리를 깨뜨리려고 했지만 불가능하다고 생각했다. 나중에 apply() 함수의 반환 값을 봤는데 GateWay Filter였다. 나는 이 원본을 눌러서 다음과 같이 보았다.
package org.springframework.cloud.gateway.filter;

/*
 * Copyright 2002-2015 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import org.springframework.cloud.gateway.support.ShortcutConfigurable;
import org.springframework.web.server.ServerWebExchange;

import reactor.core.publisher.Mono;

/**
 * Contract for interception-style, chained processing of Web requests that may
 * be used to implement cross-cutting, application-agnostic requirements such
 * as security, timeouts, and others. Specific to a Gateway
 *
 * Copied from WebFilter
 *
 * @author Rossen Stoyanchev
 * @since 5.0
 */
public interface GatewayFilter extends ShortcutConfigurable {

	String NAME_KEY = "name";
	String VALUE_KEY = "value";

	/**
	 * Process the Web request and (optionally) delegate to the next
	 * {@code WebFilter} through the given {@link GatewayFilterChain}.
	 * @param exchange the current server exchange
	 * @param chain provides a way to delegate to the next filter
	 * @return {@code Mono} to indicate when request processing is complete
	 */
	Mono filter(ServerWebExchange exchange, GatewayFilterChain chain);

}


결국 나는 이 니마가 JAVA8의 새로운 조작이 아니라는 것을 문득 깨달았다.인터페이스가 실현되지 않은 방법이 하나밖에 없을 때 만약에 되돌아오는 것이 하나의 함수라면 사실은 이 인터페이스를 되돌아오는 것은 실현 유형의 실례이다. 대응하는 실현 방법의 논리는 바로 그 함수이다. 이곳의 Gateway Filter의 filter 방법의 실현은 사실 다음과 같다.
(exchange, chain) -> {
            List strings = exchange.getRequest().getHeaders().get(config.getName());
            if (strings!=null){
                ServerHttpRequest request = exchange.getRequest().mutate()
                        .header(config.getName(), strings.get(0))
                        .build();
//                System.out.println("-----------------------------------------");
//                System.out.println(strings.get(0));
                return chain.filter(exchange.mutate().request(request).build());
            }else{
                return chain.filter(exchange);
            }
        };

동시에 (exchange, chain) 인터페이스에 있는 filter의 두 가지 매개 변수를 맞췄습니다.
요약:java8의 특성을 알지만 조작이 적다.이런 게 생겨요. 아는데 못 알아보는 거예요.

좋은 웹페이지 즐겨찾기