java.lang.IllegalArgumentException: Karakter tidak valid ditemukan dalam nama metode. Nama metode HTTP harus berupa token


161

Saya mendapatkan di bawah tumpukan jejak ketika saya menggunakan aplikasi saya di lingkungan multi-server Apache Tomcat 8. Saya sering mendapatkan kesalahan ini, dan sepertinya ia memblokir utas kucing jantan:

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)

Adakah yang bisa mengarahkan saya cara mengatasi masalah atau mempersempit pengecualian seperti itu? Saya tidak mendapatkan referensi ke file sumber aplikasi saya. Saya mencoba untuk google sekitar, dan di dalam tautan itu mengatakan, Anda mencoba mengakses url http melalui https, yang tampaknya tidak mungkin. Saya tidak mendapatkan kesalahan ini, ketika aplikasi berjalan pada instance Tomcat 8 tunggal. Saya mendapatkan ini hanya di lingkungan multi-server.

Saya juga membagikan tag meta yang saya lekatkan pada setiap halaman, jika itu membantu mengidentifikasi penyebabnya.

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

Saya juga menggunakan yang berikut ini di beberapa halaman, yang pada dasarnya sama dengan di atas:

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

Bahkan jika ada yang membantu dalam memberikan arahan untuk upaya pemecahan masalah saya, itu akan berguna, karena saat ini saya tidak tahu, ke mana harus mencari.

Terima kasih sebelumnya.

Jawaban:


266

Pengecualian ini dapat terjadi ketika Anda mencoba menjalankan permintaan HTTPS dari klien pada titik akhir yang tidak mengaktifkan HTTPS. Klien akan mengenkripsi data permintaan ketika server mengharapkan data mentah.


1
Saya tidak yakin saya mengerti jawaban ini. Saya memiliki aplikasi Spring Boot 1.5.1 dan saya melihat pengecualian ini di log saya. Aplikasi saya hanya menjawab untuk SSL pada port 8443 (dialihkan dari port 443) dan hanya memiliki satu konektor untuk SSL. Apakah Anda mengatakan bahwa seseorang dapat mencoba http: alih-alih https: di port 443?
Jim Archer

5
Pengecualian seperti itu terjadi ketika ada ketidaksesuaian antara apa yang diharapkan server dan apa yang didapatnya. Apa yang Anda katakan adalah salah satu skenario yang mungkin. Mungkin ada titik akhir di server Anda yang tidak berjalan di https, tetapi seseorang mencoba mengaksesnya dengan cara ini?
Petar Tonev

1
Hai Peter ... Masalahnya adalah seseorang membuat aturan IP Tables untuk meneruskan port 80 ke port 8443, jadi siapa pun yang mengunjungi situs menggunakan http pada port 80 menyebabkan kesalahan itu. Kami menambahkan konektor Tomcat untuk mengarahkan ulang port 8080 ke 8443 dan mengatur aturan IP Tables untuk meneruskan port 80 ke port 8080 dan masalahnya sudah hilang. Terima kasih atas balasan Anda!
Jim Archer

1
@PeterTonev: Ada ide bagaimana (mengarahkan https ke http || menonaktifkan https || menangkap kesalahan untuk setidaknya menunjukkan pesan kesalahan yang bermakna)?
crusy

1
@crusy Sesuatu yang dapat membantu Anda di sini untuk penanganan pengecualian adalah tautan
Petar Tonev

56

Saya mendapat pengecualian yang sama ketika saya diuji secara lokal. Masalahnya adalah skema URL dalam permintaan saya.

Perubahan https:// to http:// in your client url.

Mungkin ini membantu.


2
Tentu berhasil, tetapi perhatikan bahwa komunikasi melalui HTTP tidak aman.
Paramvir Singh Karwal

23

Anda memanggil server lokal dengan http : // localhost: 8080 / foo / bar. Sebut saja dengan https : // localhost: 8080 / foo / bar. Ini menyelesaikan masalah


Mungkin Anda tidak akan memiliki https: // pada 8080. Ubah panggilan ke https: // localhost: 8443 / foo / bar - Berikut ini contoh tautan - Rodrigo R. Coelho
Rodrigo R. Coelho

9

Jika seseorang menggunakan kesombongan:

Ubah Skema ke HTTPatau HTTPS, bergantung pada kebutuhan, sebelum melakukan eksekusi.

Tukang pos:

Ubah Jalur URL ke http://atau https://di alamat url


8

Saya menerima pengecualian ini yang tidak terkait dengan masalah TLS. Dalam kasus saya, nilai header Panjang Konten tidak cocok dengan panjang tubuh.


2
Saya tidak bisa cukup berterima kasih. Setiap permintaan POST lainnya gagal dengan kesalahan 400, dan saya siap mencabut rambut saya. Ternyata yang tidak mengirim content-lengthtajuk memecahkan masalah ini.
Alexander Woodblock

2
Saya mendapatkan keterlambatan 30-90sec untuk permintaan tukang pos ke pengembang lokal - ternyata, ini adalah masalah ini! Menonaktifkan Content-Lengthtajuk memperbaiki penundaan.
Alok

1

Menjawab pertanyaan lama ini (untuk orang lain yang mungkin membantu)

Mengkonfigurasi httpd conf Anda dengan benar akan membuat masalah terpecahkan. Instal server httpd apa pun, jika Anda tidak memilikinya.

Cantumkan konfigurasi saya di sini.

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

edit file seperti di atas dan kemudian restart httpd seperti di bawah ini

[smilyface@box002 ~]$ sudo service httpd restart


Dan kemudian permintaan dengan dengan httpsakan bekerja tanpa kecuali.
Permintaan juga httpakan diteruskan ke https! Jangan khawatir.


1

Saya mendapatkan kesalahan ini diselesaikan dengan melakukan 2 hal di browser chrome:

  1. Tekan Ctrl + Shift + Delete dan hapus semua data penelusuran dari awal.
  2. Buka Chrome: Pengaturan -> Pengaturan Lanjut -> Buka pengaturan proxy -> Properti Internet kemudian Buka jendela Konten dan klik pada Tombol Hapus Status SSL.

Situs ini memiliki informasi ini dan opsi lain juga: https://www.thesslstore.com/blog/fix-err-ssl-protocol-error/


1

Saya tahu ini adalah utas lama, tetapi ada kasus khusus saat ini mungkin terjadi:

Jika Anda menggunakan gerbang api AWS yang digabungkan dengan tautan VPC, dan jika Network Load Balancer memiliki protokol proksi v2 diaktifkan, 400 Permintaan Buruk akan terjadi juga.

Butuh saya sepanjang sore untuk mencari tahu, jadi jika itu dapat membantu seseorang, saya akan senang :)


0

Saya mendapatkan pengecualian yang sama, setiap kali halaman dimuat,

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)

Saya menemukan bahwa salah satu URL halaman saya adalah https alih-alih http, ketika saya mengubah yang sama, kesalahan telah hilang.


0

Ini biasanya terjadi ketika Anda menggunakan skema URI yang tidak didukung oleh server tempat aplikasi tersebut digunakan. Jadi, Anda mungkin ingin memeriksa semua skema yang didukung server Anda dan memodifikasi permintaan Anda URI, atau, Anda mungkin ingin menambahkan dukungan untuk skema itu di server Anda. Ruang lingkup aplikasi Anda akan membantu Anda memutuskan ini.


0

Itu terjadi pada saya ketika saya memiliki port yang sama digunakan dalam ssh tunnel SOCKS untuk menjalankan Proxy di port 8080 dan server saya dan proxy browser firefox saya diatur ke port itu dan mendapatkan masalah ini.


0

Dalam kasus saya, saya harus menghapus riwayat browser / cookie untuk menghilangkan kesalahan ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.