programing

스프링 부팅 시 요청 대상에 잘못된 문자가 있습니다.

lastmoon 2023. 3. 8. 21:43
반응형

스프링 부팅 시 요청 대상에 잘못된 문자가 있습니다.

제 어플리케이션은 버전 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

반응형