java.lang.IllegalArgumentException: พบอักขระที่ไม่ถูกต้องในชื่อเมธอด ชื่อเมธอด HTTP ต้องเป็นโทเค็น


161

ฉันได้รับข้อมูลการติดตามสแต็กต่ำกว่าเมื่อฉันปรับใช้แอปพลิเคชันของฉันในสภาพแวดล้อม Apache Tomcat 8 ฉันพบข้อผิดพลาดนี้บ่อยครั้งและดูเหมือนว่ากำลังบล็อกเธรด Tomcat อยู่:

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)

ผู้ใดสามารถบอกวิธีแก้ปัญหาหรือ จำกัด การเว้นดังกล่าวได้หรือไม่ ฉันไม่ได้รับการอ้างอิงใด ๆ กับไฟล์ต้นฉบับของแอปพลิเคชันของฉัน ฉันพยายามใช้ google แล้วและจากลิงก์ที่กล่าวมาคุณกำลังพยายามเข้าถึง http url ผ่าน https ซึ่งดูเหมือนไม่น่าจะเกิดขึ้น ฉันไม่ได้รับข้อผิดพลาดนี้เมื่อแอปพลิเคชันทำงานบนอินสแตนซ์ 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" />

แม้ว่าใครก็ตามที่ช่วยในการชี้แนะแนวทางในการแก้ไขปัญหาของฉันก็จะมีประโยชน์อย่างที่ฉันไม่รู้ในปัจจุบัน

ขอบคุณล่วงหน้า.

คำตอบ:


267

ข้อยกเว้นนี้สามารถเกิดขึ้นได้เมื่อคุณพยายามเรียกใช้คำขอHTTPSจากลูกค้าที่ปลายทางซึ่งไม่ได้เปิดใช้งาน HTTPS ลูกค้าจะเข้ารหัสข้อมูลที่ร้องขอเมื่อเซิร์ฟเวอร์ต้องการข้อมูลดิบ


1
ฉันไม่แน่ใจว่าฉันเข้าใจคำตอบนี้หรือไม่ ฉันมีแอพ Spring Boot 1.5.1 และฉันเห็นข้อยกเว้นนี้ในบันทึกของฉัน แอพของฉันตอบเฉพาะ SSL บนพอร์ต 8443 (เปลี่ยนเส้นทางจากพอร์ต 443) และมีตัวเชื่อมต่อเดียวสำหรับ SSL คุณกำลังบอกว่ามีคนลองใช้ http: แทนที่จะเป็น https: ที่พอร์ต 443 หรือไม่
— Jim Archer

5
ข้อยกเว้นดังกล่าวเกิดขึ้นเมื่อมีความไม่ตรงกันระหว่างสิ่งที่เซิร์ฟเวอร์คาดหวังกับสิ่งที่ได้รับ สิ่งที่คุณพูดเป็นหนึ่งในสถานการณ์ที่เป็นไปได้ อาจมีจุดสิ้นสุดในเซิร์ฟเวอร์ของคุณที่ไม่ได้ทำงานบน https แต่มีคนพยายามเข้าถึงด้วยวิธีนี้
— Petar Tonev

1
สวัสดีปีเตอร์ ... ปัญหาที่เกิดขึ้นคือมีคนสร้างกฎ IP Tables เพื่อส่งต่อพอร์ต 80 ไปยังพอร์ต 8443 ดังนั้นใครก็ตามที่เข้าชมไซต์โดยใช้ http บนพอร์ต 80 ทำให้เกิดข้อผิดพลาดนั้น เราได้เพิ่มตัวเชื่อมต่อ Tomcat เพื่อเปลี่ยนเส้นทางพอร์ต 8080 ถึง 8443 และตั้งค่ากฎ IP Tables เพื่อส่งต่อพอร์ต 80 ไปยังพอร์ต 8080 และปัญหานั้นหมดไปแล้ว ขอบคุณสำหรับคำตอบของคุณ!
— 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 วิธีนี้จะช่วยแก้ปัญหา


อาจเป็นไปได้ว่าคุณไม่มี https: // on 8080 เปลี่ยนการโทรเป็นhttps: // localhost: 8443 / foo / bar - นี่คือลิงค์ตัวอย่าง- Rodrigo R. Coelho
— Rodrigo R. Coelho

9

ในกรณีที่มีคนใช้กร่าง:

เปลี่ยน Scheme เป็นHTTPหรือHTTPSขึ้นอยู่กับความต้องการก่อนที่จะกดรัน

บุรุษไปรษณีย์:

เปลี่ยนเส้นทาง URL เป็น http://หรือhttps://ในที่อยู่ URL


8

ฉันได้รับข้อยกเว้นนี้ไม่เกี่ยวข้องกับปัญหา TLS ใด ๆ ในกรณีของฉันค่าส่วนหัวความยาวเนื้อหาไม่ตรงกับความยาวร่างกาย


2
ฉันไม่สามารถขอบคุณได้มากพอ คำขอ POST อื่น ๆ ทั้งหมดล้มเหลวด้วยข้อผิดพลาด 400 และฉันก็พร้อมที่จะตัดผมของฉัน กลายเป็นว่าไม่ได้ส่งcontent-lengthหัวแก้ปัญหานี้
— Alexander

2
ฉันได้รับล่าช้า 30-90sec สำหรับคำขอบุรุษไปรษณีย์ไปยังผู้พัฒนาในท้องถิ่น - ปรากฎว่าเป็นปัญหานี้! การปิดใช้งานContent-Lengthส่วนหัวแก้ไขความล่าช้า
— Alok

1

ตอบคำถามเก่านี้ (สำหรับคนอื่นซึ่งอาจช่วยได้) การ

กำหนดค่า httpd conf ของคุณให้ถูกต้องจะทำให้ปัญหาแก้ไขได้ ติดตั้งเซิร์ฟเวอร์ httpd ใด ๆ หากคุณยังไม่มี

แสดงรายการ config ของฉันที่นี่

[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


แล้วขอด้วยด้วยhttpsจะทำงานโดยไม่มีข้อยกเว้น
ยังขอด้วยhttpจะส่งต่อไปhttps! ไม่ต้องห่วง.


1

ฉันได้รับข้อผิดพลาดนี้แก้ไขได้ด้วยการทำ 2 สิ่งในเบราว์เซอร์ chrome:

  1. กด Ctrl + Shift + Delete และล้างข้อมูลการท่องเว็บทั้งหมดตั้งแต่ต้น
  2. ไปที่ Chrome: การตั้งค่า -> การตั้งค่าขั้นสูง -> เปิดการตั้งค่าพร็อกซี -> คุณสมบัติอินเทอร์เน็ตแล้วไปที่หน้าต่างเนื้อหาและคลิกที่ปุ่มล้างสถานะ SSL

ไซต์นี้มีข้อมูลนี้และตัวเลือกอื่น ๆ เช่นกัน: https://www.thesslstore.com/blog/fix-err-ssl-protocol-error/


1

ฉันรู้ว่านี่เป็นหัวข้อเก่า แต่มีบางกรณีที่อาจเกิดขึ้น:

หากคุณใช้เกตเวย์ AWS api ควบคู่กับลิงก์ VPC และหาก 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 หน้าหนึ่งของฉันคือ https แทนที่จะเป็น http เมื่อฉันเปลี่ยนเหมือนเดิมข้อผิดพลาดก็หายไป


0

มักจะเกิดขึ้นเมื่อคุณใช้ รูปแบบ URIที่เซิร์ฟเวอร์ไม่รองรับซึ่งมีการปรับใช้แอพ ดังนั้นคุณอาจต้องการตรวจสอบทุกรูปแบบที่เซิร์ฟเวอร์ของคุณสนับสนุนและแก้ไขคำขอของคุณURIตามนั้นหรือคุณอาจต้องการเพิ่มการสนับสนุนสำหรับรูปแบบนั้นในเซิร์ฟเวอร์ของคุณ ขอบเขตแอปพลิเคชันของคุณจะช่วยคุณตัดสินใจในเรื่องนี้


0

มันเกิดขึ้นกับฉันเมื่อฉันมีพอร์ตเดียวกันที่ใช้ใน ssh tunnel SOCKS เพื่อเรียกใช้พร็อกซีในพอร์ต 8080 และเซิร์ฟเวอร์ของฉันและพร็อกซีเบราว์เซอร์ Firefox ของฉันถูกตั้งค่าเป็นพอร์ตนั้นและได้รับปัญหานี้


0

ในกรณีของฉันฉันต้องล้างประวัติเบราว์เซอร์ / คุกกี้เพื่อกำจัดข้อผิดพลาดนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.