Сбой облачного шлюза URI - PullRequest
0 голосов
/ 20 июня 2019

Я написал приложение-шлюз, использующее двоичные файлы Spring Cloud по Гринвичу.Я вижу проблемы, когда в URL присутствуют специальные символы.Сбой запроса с нижеуказанным исключением в Spring gateway, когда URI запроса содержит специальные символы.

localhost:8080/myresource/WG_splchar_%26%5E%26%25%5E%26%23%25%24%5E%26%25%26*%25%2B)!%24%23%24%25%26%5E_new

Когда я нажимаю выше URL, Spring завершается с ошибкой за исключением следующего.Я не могу понять, почему это недопустимая последовательность и как можно обрабатывать подобные вещи.

 java.lang.IllegalArgumentException: Invalid encoded sequence "%^&#%$^&%&*%+)!$#$%&^_new"
at org.springframework.util.StringUtils.uriDecode(StringUtils.java:741) ~[spring-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.http.server.DefaultPathContainer.parsePathSegment(DefaultPathContainer.java:126) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.http.server.DefaultPathContainer.createFromUrlPath(DefaultPathContainer.java:111) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.http.server.PathContainer.parsePath(PathContainer.java:76) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory.lambda$apply$2(PathRoutePredicateFactory.java:79) ~[spring-cloud-gateway-core-2.1.0.RC3.jar:2.1.0.RC3]
at org.springframework.cloud.gateway.support.ServerWebExchangeUtils.lambda$toAsyncPredicate$1(ServerWebExchangeUtils.java:128) ~[spring-cloud-gateway-core-2.1.0.RC3.jar:2.1.0.RC3]
at org.springframework.cloud.gateway.handler.AsyncPredicate.lambda$and$1(AsyncPredicate.java:35) ~[spring-cloud-gateway-core-2.1.0.RC3.jar:2.1.0.RC3]
at org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping.lambda$null$2(RoutePredicateHandlerMapping.java:112) ~[spring-cloud-gateway-core-2.1.0.RC3.jar:2.1.0.RC3]
at reactor.core.publisher.MonoFilterWhen$MonoFilterWhenMain.onNext(MonoFilterWhen.java:116) [reactor-core-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2070) [reactor-core-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at reactor.core.publisher.MonoFilterWhen$MonoFilterWhenMain.onSubscribe(MonoFilterWhen.java:103) [reactor-core-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54) [reactor-core-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at reactor.core.publisher.MonoFilterWhen.subscribe(MonoFilterWhen.java:56) [reactor-core-3.2.5.RELEASE.jar:3.2.5.RELEASE]

1 Ответ

1 голос
/ 21 июня 2019

Я уже ответил на другой вопрос и не хочу перепечатывать.Дух ответа точно такой же.

Напишите модульный тест, использующий этот метод, из утилит Spring cloud.Это то, что ломается.Вы можете попытаться передать более или менее интересующую вас строку, чтобы узнать, где находится разрыв.Используйте бинарный поиск, чтобы выяснить, что сломано.Убедитесь, что вы не разбиваете строку в середине закодированного символа, иначе вы дадите себе ложный положительный результат.Когда он говорит, что у вас недопустимая последовательность, я ожидаю, что у вас есть что-то вроде% 99, где значение 99 не соответствует ни одному действительному символу (я просто создаю его)

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/StringUtils.html#uriDecode-java.lang.String-java.nio.charset.Charset-

В сторону

Откуда эта кодированная строка?Кто-то в вашей компании создал собственное решение для кодирования этой строки?Вы принимаете данные пользователя?ОЧЕНЬ ВОЗМОЖНО, кто бы ни отвечал за создание этой строки, закодировавшей ее неправильно, путем homerolrol их собственного кодера.

АЛЬТЕРНАТИВНО

spring.cloud.gateway.routes[7].predicates[0]=Path=/test/{testId}/test1/test_%26%5E%26%25%5E%26%25%26*%25%2B)!

Когда я смотрю на это, я вижупуть, который уже закодирован .Например, вы взяли свой амперсанд и символ и заменили его на% 26

Вы пытались ввести путь, который НЕ уже закодирован?

Например spring.cloud.gateway.routes[7].predicates[0]=Path=/test/{testId}/test1/test_&^&%^ <Я только частичнорасшифровал это вручную, используя эту диаграмму.<a href="https://www.w3schools.com/tags/ref_urlencode.asp" rel="nofollow noreferrer">https://www.w3schools.com/tags/ref_urlencode.asp

...