java.lang.IllegalArgumentException : 메소드 명에 유효하지 않은 문자가 있습니다. HTTP 메소드 이름은 토큰이어야합니다


161

다중 서버 Apache Tomcat 8 환경에서 응용 프로그램을 배포 할 때 스택 추적이 낮아집니다. 이 오류가 자주 발생하고 바람둥이 스레드를 차단하는 것 같습니다.

INFO [http-nio-80-exec-4461] org.apache.coyote.http11.AbstractHttp11Processor.process Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
 java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
 at org.apache.coyote.http11.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:233)
 at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017)
 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1524)
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1480)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
 at java.lang.Thread.run(Unknown Source)

아무도 그런 문제를 해결하거나 좁히는 방법을 알려 줄 수 있습니까? 내 응용 프로그램 소스 파일에 대한 참조가 없습니다. 나는 주변에서 구글을 시도했지만, 링크에서 https를 통해 http url에 액세스하려고 시도하는 것 같지 않다. 응용 프로그램이 단일 Tomcat 8 인스턴스에서 실행될 때이 오류가 발생하지 않습니다. 나는 다중 서버 환경에서만 이것을 얻는다.

또한 원인을 식별하는 데 도움이되는 경우 각 페이지에 포함 된 메타 태그를 공유하고 있습니다.

<%
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Cache-Control", "no-store");
    response.setDateHeader("Expires", 0);
    response.setHeader("Pragma", "no-cache");
%>


<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta name="viewport" content="width=device-width, initial-scale=1">

또한 몇 페이지에서 다음을 사용하고 있으며 기본적으로 위와 같습니다.

<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Expires" content="-1" />
<meta http-equiv="Cache-Control" content="private" />
<meta http-equiv="Cache-Control" content="no-store" />
<meta http-equiv="Pragma" content="no-cache" />

누구든지 내 문제 해결 시도에 대한 지침을 제공하는 데 도움이 되더라도 현재 알지 못하므로 어디를 살펴볼 것인지 유용합니다.

미리 감사드립니다.

답변:


266

이 예외는 HTTPS를 사용할 수없는 엔드 포인트에서 클라이언트의 HTTPS 요청 을 실행하려고 할 때 발생할 수 있습니다 . 클라이언트는 서버가 원시 데이터를 기대할 때 요청 데이터를 암호화합니다.


1
이 답변을 이해하지 못했습니다. Spring Boot 1.5.1 앱이 있으며 로그 에서이 예외를 보았습니다. 내 응용 프로그램은 포트 8443 (포트 443에서 리디렉션 됨)의 SSL에 대해서만 응답하고 SSL에 대한 커넥터는 하나만 있습니다. 누군가 포트 443에서 https : 대신 http :를 시도 할 수 있다고 말하고 있습니까?
Jim Archer

5
이러한 예외는 서버가 기대하는 것과 서버가 얻는 것 사이에 불일치가있을 때 발생합니다. 당신이 말한 것은 가능한 시나리오 중 하나입니다. 서버에서 https로 실행되지 않는 엔드 포인트가있을 수 있지만 누군가이 방법으로 액세스하려고합니까?
Petar Tonev

1
안녕하세요 피터 ... 문제는 누군가가 포트 80을 포트 8443으로 전달하기 위해 IP 테이블 규칙을 만들었 기 때문에 포트 80에서 http를 사용하여 사이트를 방문한 사람은 그 오류를 일으켰습니다. 포트 8080을 8443으로 리디렉션하기 위해 Tomcat 커넥터를 추가하고 포트 8080을 포트 8080으로 전달하도록 IP 테이블 규칙을 설정했는데 문제는 사라졌습니다. 답장을 보내 주셔서 감사합니다!
Jim Archer

1
@PeterTonev : 어떻게 생각해야합니까 (https를 http로 리디렉션 || https를 비활성화 || 의미있는 오류 메시지를 표시하려면 오류를 잡으십시오)?
crusy

1
@crusy 예외 처리를 위해 여기에 도움이 될만한 것이 링크입니다
Petar Tonev

56

로컬 테스트를 할 때도 동일한 예외가 발생했습니다. 문제는 요청의 URL 스키마였습니다.

변화 https:// to http:// in your client url.

아마 도움이 될 것입니다.


2
물론 작동하지만 HTTP를 통한 통신은 안전하지 않습니다.
Paramvir Singh Karwal

23

http : // localhost : 8080 / foo / bar를 사용 하여 로컬 서버를 호출하고 있습니다. https : // localhost : 8080 / foo / bar로 호출하십시오 . 이것은 문제를 해결


아마도 8080에 https : //가 없을 것입니다. https : // localhost : 8443 / foo / bar로 통화를 변경하십시오. 다음은 링크 예입니다. – Rodrigo R. Coelho
Rodrigo R. Coelho

9

누군가가 swagger를 사용하는 경우 :

실행하기 전에 Scheme을 HTTP또는로 변경하고 HTTPS필요에 따라 변경하십시오 .

우편 집배원:

URL 경로 http://또는 https://URL 주소로 URL 경로 변경


8

TLS 문제와 관련이없는이 예외를 받았습니다. 필자의 경우 Content-Length 헤더 값이 본문 길이와 일치하지 않았습니다.


2
고마워요 다른 모든 POST 요청은 400 오류로 실패했으며 머리카락을 찢을 준비가되었습니다. content-length헤더를 보내지 않으면 이 문제가 해결됩니다.
Alexander Woodblock

2
로컬 개발자에 대한 Postman 요청에 대해 30-90 초의 지연이 발생했습니다.이 문제였습니다! Content-Length헤더를 비활성화하면 지연이 해결되었습니다.
Alok

1

(도움이 될 수 있습니다 다른 사람을 위해)이 오래된 질문에 대답

문제를 만들 것입니다 올바르게 아파치의 conf의 구성 해결했다. httpd 서버가 없으면 설치하십시오.

내 설정을 여기에 나열하십시오.

[smilyface@box002 ~]$ cat /etc/httpd/conf/httpd.conf | grep shirts | grep -v "#"


        ProxyPass /shirts-service http://local.box002.com:16743/shirts-service
        ProxyPassReverse /shirts-service http://local.box002.com:16743/shirts-service
        ProxyPass /shirts http://local.box002.com:16443/shirts
        ProxyPassReverse /shirts http://local.box002.com:16443/shirts
        ...
        ...
        ...

위와 같이 파일을 편집 한 다음 아래와 같이 httpd를 다시 시작하십시오.

[smilyface@box002 ~]$ sudo service httpd restart


그런 다음 with 요청은 https예외없이 작동합니다.
또한 http의지 와 함께 요청 합니다 https! 걱정 마.


1

크롬 브라우저에서 두 가지 작업을 수행 하여이 오류가 해결되었습니다.

  1. Ctrl + Shift + Delete를 누르고 모든 브라우징 데이터를 처음부터 지 웁니다.
  2. Chrome : 설정-> 고급 설정-> 프록시 설정 열기-> 인터넷 속성으로 이동 한 다음 콘텐츠 창으로 이동하여 SSL 상태 지우기 버튼을 클릭하십시오.

이 사이트에는이 정보와 다른 옵션들도 있습니다 : https://www.thesslstore.com/blog/fix-err-ssl-protocol-error/


1

나는 이것이 오래된 스레드라는 것을 알고 있지만 이것이 일어날 수있는 특별한 경우가 있습니다.

VPC 링크와 함께 AWS API 게이트웨이를 사용하고 Network Load Balancer에 프록시 프로토콜 v2가 활성화 된 경우 400 잘못된 요청도 발생합니다.

그것을 알아 내기 위해 오후 내내 나를 데려갔습니다. 따라서 누군가 도울 수 있다면 기쁠 것입니다 :)


0

페이지가로드 될 때마다 동일한 예외가 발생했습니다.

NFO: Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
    at org.apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:139)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1028)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

내 페이지 URL 중 하나가 http가 아닌 https라는 것을 알았습니다. 동일하게 변경하면 오류가 사라졌습니다.


0

일반적으로 앱이 배포 된 서버에서 지원하지 않는 URI 체계 를 사용하는 경우에 발생합니다 . 따라서 서버가 지원하는 모든 체계를 확인하고 URI그에 따라 요청을 수정 하거나 서버에서 해당 체계에 대한 지원을 추가 할 수 있습니다. 응용 프로그램의 범위는이를 결정하는 데 도움이됩니다.


0

ssh tunnel SOCKS에서 동일한 포트를 사용하여 8080 포트에서 프록시를 실행하고 서버와 파이어 폭스 브라우저 프록시가 해당 포트로 설정 되어이 문제가 발생했을 때 나에게 일어났습니다.


0

내 경우에는이 오류를 제거하기 위해 브라우저 기록 / 쿠키를 지워야했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.