From 0c042beb3f122ecefd6dcbd4b449b2af3581ad10 Mon Sep 17 00:00:00 2001 From: huangsimin Date: Wed, 17 Jul 2019 17:59:58 +0800 Subject: [PATCH] =?UTF-8?q?90%=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E8=A6=86=E7=9B=96=E7=8E=87,=20=E5=9F=BA=E6=9C=AC=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E4=BD=BF=E7=94=A8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../usergw/biz/filters/VerifyFilter.java | 71 +++++++++---------- .../factory/DubboGatewayFilterFactory.java | 14 +--- .../service/usergw/config/ConfigGateway.java | 2 +- .../src/main/resources/test-gateway.yaml | 12 ++-- .../src/main/resources/test-gateway3.yaml | 25 +++++-- .../service/usergw/TestHttp2DubboConfig3.java | 48 +++++++++++-- .../service/usergw/utils/TestExtract.java | 2 - 8 files changed, 105 insertions(+), 71 deletions(-) diff --git a/pom.xml b/pom.xml index e2d34af..7017787 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 1.8 UTF-8 UTF-8 - Greenwich.SR1 + Greenwich.SR2 2.7.2 diff --git a/usergw-service/src/main/java/cn/ecpark/service/usergw/biz/filters/VerifyFilter.java b/usergw-service/src/main/java/cn/ecpark/service/usergw/biz/filters/VerifyFilter.java index dee73a7..17f2710 100644 --- a/usergw-service/src/main/java/cn/ecpark/service/usergw/biz/filters/VerifyFilter.java +++ b/usergw-service/src/main/java/cn/ecpark/service/usergw/biz/filters/VerifyFilter.java @@ -8,7 +8,6 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; -import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import lombok.extern.slf4j.Slf4j; @@ -17,48 +16,48 @@ import reactor.core.publisher.Mono; @Slf4j @SpringBootConfiguration @Order(-200) -public class VerifyFilter { +public class VerifyFilter implements GlobalFilter { - // @Override - // public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { - // if (true) - // return chain.filter(exchange); - // // TODO: 添加权限 - // ServerHttpRequest request = exchange.getRequest(); - // HttpHeaders header = request.getHeaders(); + if (true) + return chain.filter(exchange); + // TODO: 添加权限 + ServerHttpRequest request = exchange.getRequest(); + HttpHeaders header = request.getHeaders(); - // ServerHttpResponse response = exchange.getResponse(); - // HttpHeaders respHeader = response.getHeaders(); - // respHeader.add("token-expire", String.valueOf(System.currentTimeMillis() / 1000)); - // respHeader.add("version", "v0.0.1"); + ServerHttpResponse response = exchange.getResponse(); + HttpHeaders respHeader = response.getHeaders(); + respHeader.add("token-expire", String.valueOf(System.currentTimeMillis() / 1000)); + respHeader.add("version", "v0.0.1"); - // String token = header.getFirst("token"); - // if (token != null) { - // // - // if (VerifyToken(token)) { - // log.info("request token is Verify Successed: {}", token); - // return chain.filter(exchange); - // } - // log.info("request token is Verify Fail: {} != {}", token, TEST_TOKEN); - // } else { - // log.warn("request token is empty: {}", request.getURI()); - // } + String token = header.getFirst("token"); + if (token != null) { + // + if (VerifyToken(token)) { + log.info("request token is Verify Successed: {}", token); + return chain.filter(exchange); + } + log.info("request token is Verify Fail: {} != {}", token, TEST_TOKEN); + } else { + log.warn("request token is empty: {}", request.getURI()); + } - // if (!response.setStatusCode(HttpStatus.UNAUTHORIZED)) { - // log.error("if the status code has not been set because the HTTP response is already committed"); - // } + if (!response.setStatusCode(HttpStatus.UNAUTHORIZED)) { + log.error("if the status code has not been set because the HTTP response is already committed"); + } - // return response.setComplete(); - // } + return response.setComplete(); + } - // public static final String TEST_TOKEN = "yame"; + public static final String TEST_TOKEN = "yame"; - // public boolean VerifyToken(String token) { - // if (token.equals(TEST_TOKEN)) { - // return true; - // } - // return false; - // } + public boolean VerifyToken(String token) { + if (token.equals(TEST_TOKEN)) { + return true; + } + return false; + } } \ No newline at end of file diff --git a/usergw-service/src/main/java/cn/ecpark/service/usergw/biz/filters/factory/DubboGatewayFilterFactory.java b/usergw-service/src/main/java/cn/ecpark/service/usergw/biz/filters/factory/DubboGatewayFilterFactory.java index c6c9f66..2b240b7 100644 --- a/usergw-service/src/main/java/cn/ecpark/service/usergw/biz/filters/factory/DubboGatewayFilterFactory.java +++ b/usergw-service/src/main/java/cn/ecpark/service/usergw/biz/filters/factory/DubboGatewayFilterFactory.java @@ -1,9 +1,6 @@ package cn.ecpark.service.usergw.biz.filters.factory; -import java.lang.annotation.Retention; -import java.lang.reflect.Field; import java.nio.ByteBuffer; -import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; @@ -12,28 +9,19 @@ import java.util.List; import com.alibaba.fastjson.JSON; import org.apache.dubbo.rpc.service.GenericService; -import org.reactivestreams.Publisher; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilterChain; -import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter; import org.springframework.cloud.gateway.filter.OrderedGatewayFilter; -import org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter; import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; -import org.springframework.cloud.gateway.filter.factory.SetStatusGatewayFilterFactory; -import org.springframework.cloud.gateway.handler.FilteringWebHandler; import org.springframework.context.ApplicationContext; import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; -import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; -import org.springframework.http.server.reactive.ServerHttpResponseDecorator; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; -import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.setResponseStatus; import cn.ecpark.service.usergw.biz.filters.bean.GenericServicePool; import lombok.extern.slf4j.Slf4j; @@ -107,7 +95,7 @@ public class DubboGatewayFilterFactory extends AbstractGatewayFilterFactory { ServerHttpRequest req = exchange.getRequest(); diff --git a/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigGateway.java b/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigGateway.java index b63dcf1..e62b6a1 100644 --- a/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigGateway.java +++ b/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigGateway.java @@ -91,7 +91,7 @@ public class ConfigGateway implements RouteDefinitionLocator { List defaultFiltersYaml = null; Map restfulYaml = null; Map dubboYaml = null; - + Object unknown; unknown = configYaml.get("default-filters"); if (unknown != null) { diff --git a/usergw-service/src/main/resources/test-gateway.yaml b/usergw-service/src/main/resources/test-gateway.yaml index 3ecb970..2e900a4 100644 --- a/usergw-service/src/main/resources/test-gateway.yaml +++ b/usergw-service/src/main/resources/test-gateway.yaml @@ -7,22 +7,22 @@ restful: uri: http://httpbin.org:80/* order: 9 predicates: - - Path=/get - - Header=XX, \d+ + - Path=/get + - Header=XX, \d+ - id: path_route12; uri: http://httpbin.org:80/* order: 9 predicates: - - Path=/get - - Header=XX, \d+ + - Path=/get + - Header=XX, \d+ - id: path_route13 uri: http://httpbin.org:80/* order: 9 predicates: - - Path=/get - - Header=XX, \d+ + - Path=/get + - Header=XX, \d+ # - id: redirect_to # uri: http://localhost/test/** # order: 11 diff --git a/usergw-service/src/main/resources/test-gateway3.yaml b/usergw-service/src/main/resources/test-gateway3.yaml index eef4623..abc489f 100644 --- a/usergw-service/src/main/resources/test-gateway3.yaml +++ b/usergw-service/src/main/resources/test-gateway3.yaml @@ -1,15 +1,26 @@ -default-filters: - - AddResponseHeader=X-Response-Default-Foo, Test-Default-Bar - restful: # filters 必须 有predicates uri只是预期到达的地址 routes: - - id: redirect_to + - id: haha + uri: http://localhost:4444 + order: 0 + predicates: + - Path=/http/hello + + - id: rewrite + uri: http://localhost:4444 + order: 0 + predicates: + - Path=/http/rewrite + filters: + - RewritePath=/http/rewrite, /http/hello + + - id: xixi uri: http://localhost:8888/http/xixi order: 11 predicates: - - Path=http://localhost:8888/http/xixi + - Path=/http/xixi filters: - - RedirectTo=302, http://localhost:8888/http/hello + - RedirectTo=302, http://localhost:4444/http/hello dubbo: routes: @@ -28,6 +39,6 @@ dubbo: interface: ocean.demo.api.IExchange version: 1.0.0 predicates: - - Path=/dubbo/hello + - Path=/dubbo/hello \ No newline at end of file diff --git a/usergw-service/src/test/java/cn/ecpark/service/usergw/TestHttp2DubboConfig3.java b/usergw-service/src/test/java/cn/ecpark/service/usergw/TestHttp2DubboConfig3.java index 50ea3dc..9e9335d 100644 --- a/usergw-service/src/test/java/cn/ecpark/service/usergw/TestHttp2DubboConfig3.java +++ b/usergw-service/src/test/java/cn/ecpark/service/usergw/TestHttp2DubboConfig3.java @@ -1,5 +1,9 @@ package cn.ecpark.service.usergw; +import java.util.Map; + +import com.alibaba.fastjson.JSON; + import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -14,7 +18,7 @@ import reactor.netty.http.client.HttpClient.ResponseReceiver; import reactor.netty.http.client.HttpClientResponse; // TODO: 添加附加Dubbo Service for Test启动进程 -@SpringBootTest(classes = App.class, webEnvironment = WebEnvironment.RANDOM_PORT) +@SpringBootTest(classes = App.class, webEnvironment = WebEnvironment.DEFINED_PORT) @RunWith(SpringRunner.class) @TestPropertySource(locations = { "application3.properties" }) public class TestHttp2DubboConfig3 { @@ -43,21 +47,55 @@ public class TestHttp2DubboConfig3 { @Test + @SuppressWarnings("unchecked") public void Test3RestfulFilters() { // Test Base Url HttpClient client = HttpClient.create(); ResponseReceiver receiver; String content; - + + // Test 302 receiver = client.baseUrl("http://localhost:" + serverPort + "/http/xixi").get(); - HttpClientResponse response = receiver.response().block(); Assert.assertNotNull(response); Assert.assertEquals(response.status().code(), 302); content = receiver.responseContent().asString().blockLast(); - Assert.assertNotNull(content); - Assert.assertEquals(content, "Hello Dubbo"); + Assert.assertNull(content); + + // Test RedirectTo + receiver = client.baseUrl("http://localhost:" + serverPort + "/http/xixi").followRedirect(true).get(); + response = receiver.response().block(); + Assert.assertEquals(response.status().code(), 200); + content = receiver.responseContent().asString().blockLast(); + Assert.assertEquals(content, "Http Hello"); + + // 测试没配置的路由 + receiver = client.baseUrl("http://localhost:" + serverPort + "/xixi").followRedirect(true).get(); + response = receiver.response().block(); + Assert.assertEquals(response.status().code(), 404); + content = receiver.responseContent().asString().blockLast(); + Assert.assertNotNull(content); + + Object rjson = JSON.parse(content); + Map rmap = (Map)rjson; + Assert.assertEquals(rmap.get("error").toString(), "Not Found"); + + // 测试普通路由 + receiver = client.baseUrl("http://localhost:" + serverPort + "/http/hello").get(); + response = receiver.response().block(); + Assert.assertEquals(response.status().code(), 200); + content = receiver.responseContent().asString().blockLast(); + Assert.assertNotNull(content); + + // 测试普通路由 + receiver = client.baseUrl("http://localhost:" + serverPort + "/http/rewrite").get(); + response = receiver.response().block(); + Assert.assertEquals(response.status().code(), 200); + content = receiver.responseContent().asString().blockLast(); + Assert.assertEquals(content, "Http Hello"); + + } diff --git a/usergw-service/src/test/java/cn/ecpark/service/usergw/utils/TestExtract.java b/usergw-service/src/test/java/cn/ecpark/service/usergw/utils/TestExtract.java index f63571e..654dd86 100644 --- a/usergw-service/src/test/java/cn/ecpark/service/usergw/utils/TestExtract.java +++ b/usergw-service/src/test/java/cn/ecpark/service/usergw/utils/TestExtract.java @@ -1,13 +1,11 @@ package cn.ecpark.service.usergw.utils; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.apache.dubbo.config.ReferenceConfig; import org.apache.dubbo.rpc.service.GenericService; import org.junit.Assert; import org.junit.Test; -import org.springframework.boot.test.context.TestComponent; import cn.ecpark.service.usergw.utils.Extract.GenericServiceBase;