java.lang.IllegalArgumentException: Ký tự không hợp lệ được tìm thấy trong tên phương thức. Tên phương thức HTTP phải là mã thông báo


161

Tôi nhận được dấu vết ngăn xếp dưới đây khi tôi triển khai ứng dụng của mình trong môi trường đa máy chủ Apache Tomcat 8. Tôi nhận được lỗi này thường xuyên và có vẻ như nó đang chặn luồng 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)

Có ai có thể chỉ dẫn tôi cách khắc phục sự cố hoặc thu hẹp sự miễn trừ như vậy không? Tôi không nhận được bất kỳ tham chiếu đến bất kỳ tập tin nguồn ứng dụng của tôi. Tôi đã cố gắng google xung quanh và trong các liên kết mà nó nói, bạn đang cố gắng truy cập url http thông qua https, điều này dường như không thể. Tôi không gặp phải lỗi này, khi ứng dụng chạy trên một phiên bản Tomcat 8 duy nhất. Tôi nhận được điều này chỉ trong một môi trường nhiều máy chủ.

Tôi cũng đang chia sẻ các thẻ meta tôi đã nhúng trên mỗi trang, nếu điều đó giúp xác định nguyên nhân.

<%
    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">

Tôi cũng đang sử dụng những điều sau đây trong một vài trang, về cơ bản là giống như trên:

<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" />

Ngay cả khi có ai giúp đưa ra hướng xử lý sự cố của tôi, điều đó sẽ hữu ích, vì hiện tại tôi không biết, nên xem xét ở đâu.

Cảm ơn trước.

Câu trả lời:


265

Ngoại lệ này có thể xảy ra khi bạn cố gắng thực hiện yêu cầu HTTPS từ máy khách trên điểm cuối không bật HTTPS. Khách hàng sẽ mã hóa dữ liệu yêu cầu khi máy chủ đang mong đợi dữ liệu thô.


1
Tôi không chắc là tôi hiểu câu trả lời này. Tôi có ứng dụng Spring Boot 1.5.1 và tôi đã thấy ngoại lệ này trong nhật ký của mình. Ứng dụng của tôi chỉ trả lời cho SSL trên cổng 8443 (được chuyển hướng từ cổng 443) và chỉ có một trình kết nối cho SSL. Bạn đang nói rằng ai đó có thể thử http: thay vì https: trên cổng 443?
Jim Archer

5
Một trường hợp ngoại lệ như vậy xảy ra khi có sự không phù hợp giữa những gì máy chủ mong đợi và những gì nó nhận được. Những gì bạn nói là một trong những tình huống có thể xảy ra. Có thể có một điểm cuối trong máy chủ của bạn không chạy trên https, nhưng ai đó cố gắng truy cập theo cách này?
Petar Tonev

1
Xin chào Peter ... Vấn đề cuối cùng là ai đó đã tạo quy tắc Bảng IP để chuyển tiếp cổng 80 sang cổng 8443, do đó, bất kỳ ai truy cập trang web bằng http trên cổng 80 đều gây ra lỗi đó. Chúng tôi đã thêm trình kết nối Tomcat để chuyển hướng cổng 8080 đến 8443 và thiết lập quy tắc Bảng IP để chuyển tiếp cổng 80 sang cổng 8080 và vấn đề đã được giải quyết. Cảm ơn bạn đã trả lời!
Jim Archer

1
@PeterTonev: Bạn có ý tưởng nào (chuyển hướng https sang http || vô hiệu hóa https || bắt lỗi để ít nhất hiển thị thông báo lỗi có ý nghĩa) không?
khủng hoảng

1
@crusy Một cái gì đó có thể giúp bạn xử lý ngoại lệ là liên kết
Petar Tonev

56

Tôi đã có ngoại lệ tương tự khi tôi thử nghiệm tại địa phương. Vấn đề là một lược đồ URL trong yêu cầu của tôi.

Thay đổi https:// to http:// in your client url.

Có lẽ nó giúp.


2
Chắc chắn nó hoạt động, nhưng lưu ý rằng giao tiếp qua HTTP không an toàn.
Paramvir Singh Karwal

23

Bạn đang gọi máy chủ cục bộ bằng http : // localhost: 8080 / foo / bar. Gọi nó bằng https : // localhost: 8080 / foo / bar. Điều này giải quyết vấn đề


Có thể bạn sẽ không có https: // trên 8080. Thay đổi cuộc gọi thành https: // localhost: 8443 / foo / bar - Đây là liên kết ví dụ - Rodrigo R. Coelho
Rodrigo R. Coelho

9

Trong trường hợp ai đó đang sử dụng swagger:

Thay đổi Lược đồ thành HTTPhoặc HTTPS, tùy thuộc vào nhu cầu, trước khi thực hiện.

Người phát thơ:

Thay đổi Đường dẫn URL thành http://hoặc https://trong địa chỉ url


8

Tôi đã nhận được ngoại lệ này không liên quan đến bất kỳ vấn đề TLS nào. Trong trường hợp của tôi, giá trị tiêu đề Độ dài nội dung không khớp với chiều dài cơ thể.


2
Tôi không thể cảm ơn đủ. Mọi yêu cầu POST khác đều thất bại với lỗi 400 và tôi đã sẵn sàng xé tóc ra. Hóa ra việc không gửi content-lengthtiêu đề sẽ giải quyết vấn đề này.
Alexander Woodblock

2
Tôi đã nhận được sự chậm trễ 30-90 giây cho các yêu cầu của Postman cho nhà phát triển địa phương - hóa ra, đó là vấn đề này! Vô hiệu hóa Content-Lengthtiêu đề cố định độ trễ.
Alok

1

Trả lời câu hỏi cũ này (đối với những người khác có thể giúp đỡ) Định

cấu hình chính xác httpd conf của bạn sẽ giúp giải quyết vấn đề. Cài đặt bất kỳ máy chủ httpd, nếu bạn không có.

Liệt kê cấu hình của tôi ở đây.

[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
        ...
        ...
        ...

chỉnh sửa tập tin như trên và sau đó khởi động lại httpd như bên dưới

[smilyface@box002 ~]$ sudo service httpd restart


Và sau đó yêu cầu với httpssẽ làm việc mà không có ngoại lệ.
Cũng yêu cầu với httpsẽ chuyển tiếp https! Đừng lo lắng.


1

Tôi đã khắc phục lỗi này bằng cách thực hiện 2 điều trong trình duyệt chrome:

  1. Nhấn Ctrl + Shift + Xóa và xóa tất cả dữ liệu duyệt web từ đầu.
  2. Truy cập Chrome: Cài đặt -> Cài đặt nâng cao -> Mở cài đặt proxy -> Thuộc tính Internet sau đó Chuyển đến cửa sổ Nội dung và nhấp vào nút Xóa trạng thái SSL.

Trang web này cũng có thông tin này và các tùy chọn khác: https://www.thesslstore.com/blog/fix-err-ssl-protatio-error/


1

Tôi biết đây là một chủ đề cũ, nhưng có một trường hợp cụ thể khi điều này có thể xảy ra:

Nếu bạn đang sử dụng cổng api AWS kết hợp với liên kết VPC và nếu Network Load Balancer có giao thức proxy v2 được bật, 400 Yêu cầu xấu cũng sẽ xảy ra.

Tôi đã mất cả buổi chiều để tìm ra nó, vì vậy nếu nó có thể giúp được ai đó tôi sẽ vui mừng :)


0

Tôi đã nhận được cùng một ngoại lệ, bất cứ khi nào một trang được tải,

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)

Tôi thấy rằng một trong những URL trang của tôi là https thay vì http, khi tôi thay đổi tương tự, lỗi đã biến mất.


0

Điều này thường xảy ra khi bạn đang sử dụng lược đồ URI không được máy chủ hỗ trợ triển khai ứng dụng. Vì vậy, bạn có thể muốn kiểm tra tất cả các lược đồ mà máy chủ của bạn hỗ trợ và sửa đổi yêu cầu của bạn cho URIphù hợp, hoặc, bạn có thể muốn thêm hỗ trợ cho lược đồ đó trong máy chủ của mình. Phạm vi ứng dụng của bạn sẽ giúp bạn quyết định về điều này.


0

Nó xảy ra với tôi khi tôi có cùng một cổng được sử dụng trong ssh đường hầm SOCKS để chạy Proxy trong cổng 8080 và máy chủ của tôi và proxy trình duyệt firefox của tôi đã được đặt thành cổng đó và gặp sự cố này.


0

Trong trường hợp của tôi, tôi đã phải xóa lịch sử trình duyệt / cookie để thoát khỏi lỗi này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.