스프링 부팅 시 요청 대상에 잘못된 문자가 있습니다.
제 어플리케이션은 버전 1.5.6의 java -jar에서 시작됩니다.스프링 부츠 해제
제가 요청한 내용 중 하나에 "{"라는 문자가 있습니다.서버에 송신되면, 다음의 예외가 발생합니다.
java.displaces를 클릭합니다.부정 인수예외:요청 대상에 잘못된 문자가 있습니다.유효한 문자는 RFC 7230 및 RFC 3986(org.apache.coyote)에 정의되어 있습니다.org.apache.coyote의 http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:472)을 참조해 주세요.http11.Http11 프로세서org.apache.coyote의 service(Http11Processor.java:683)를 참조해 주세요.org.apache.coyote의 AbstractProcessorLight.process(AbstractProcessorLight.java:66)입니다.Abstract Protocol$ConnectionHandler.process(AbstractProtocol).java:868)를 참조해 주세요.org.apache.tomcat.util.netNioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)을 참조하십시오.org.apache.tomcat.util.net.socketProcessorBase.run(SocketProcessorBase.java:49)을 java.util.concurrent로 실행합니다.java.util.concurrent의 ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)를 지정합니다.ThreadPoolExecutor$org.apache.tomcat.util.threads의 Worker.run(ThreadPoolExecutor.java:617).java.lang에서 TaskThread$WrapingRunnable.run(TaskThread.java:61)을 실행합니다.Thread.run(Thread.java:745)
어디가 잘못됐나요?어떻게 고치죠?
편집 1:
내 휴식은 이렇다.
var jsonData = {
id: $("#hiddenId").val(),
permitNumber: $("#txtPermitNumber").val(),
permitToDate: $("#txtPermitToDate").val()
}
document.location = restUrl + "/print?reportParams= " + JSON.stringify(jsonData);
https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html,에 따르면 requestTargetAllow는 권장되지 않습니다.저는 여기에 제시된 다른 솔루션도 효과가 없었습니다.Tomcat 문서에 따르면 속성을 완화하는 방법을 찾았습니다.대신 QueryChars:
@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
connector.setProperty("relaxedQueryChars", "|{}[]");
}
});
return factory;
}
Spring Boot(2.X) 어플리케이션의 경우 속성 파일에 추가합니다.
server.tomcat.relaxed-query-chars=|,{,},[,]
다음 키도 있습니다.server.tomcat.relaxed-path-chars
Spring Boot 앱을 이렇게 시작합니다.
$ java -jar -Dtomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
demo-0.0.1-SNAPSHOT.jar
또는 uri를 다음과 같이 인코딩합니다.
document.location = restUrl + "/print?reportParams= " + encodeURI(JSON.stringify(jsonData));
application.syslogl을 사용하는 경우 다음 구성을 추가합니다.
server:
tomcat:
relaxed-query-chars: '|,{,},[,]'
간단한 방법은 메인 클래스에 이 코드를 추가하는 것입니다.
System.setProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow", "{}");
SpringBoot 1.5.17의 경우.풀어주다.아래 코드가 효과가 있었습니다.
@Configuration
public class ServerConfig {
@Bean
public EmbeddedServletContainerFactory webServerFactory() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
connector.setProperty("relaxedQueryChars", "|{}[]");
}
});
return factory;
}
}
Spring Boot 어플리케이션의 경우 속성 파일에 다음 정보가 있습니다.
server.tomcat.additional-tld-skip-patterns=xercesImpl.jar,xml-apis.jar,xml-apis.jar,jaxb-core.jar,jaxb-api.jar
저도 같은 문제에 직면했고 저는 교체로 문제를 해결했습니다.@GetMapping
타타에 @PostMapping
.
요구측에서 Base 64 문자열로 인코딩하고 컨트롤러측에서 디코딩합니다.
부호화
btoa(string)
디코드:
String arr = request.getParameter();
arr = new String(Base64.getDecoder().decode(arr))
언급URL : https://stackoverflow.com/questions/46251131/invalid-character-found-in-the-request-target-in-spring-boot
'programing' 카테고리의 다른 글
Spring MVC 및 부트를 통한 정적 콘텐츠 갱신 (0) | 2023.03.08 |
---|---|
스프링 부트 및 gRPC 및 Protobuf 사용 (0) | 2023.03.08 |
폴더를 라라벨로 작성하다 (0) | 2023.03.08 |
워드프레스 컨택폼7 텍스트 영역 콜 및 행이 작은 화면에서 변경됨 (0) | 2023.03.08 |
jQuery is not defined in Wordpress, but my script is enqueued properly (0) | 2023.03.08 |