java.lang.IllegalArgumentException: Yöntem adında geçersiz karakter bulundu. HTTP yöntem adları belirteç olmalıdır


161

Uygulamamı çok sunuculu bir Apache Tomcat 8 ortamında dağıtırken yığın izinin altına giriyorum. Bu hatayı sık sık alıyorum ve tomcat iş parçacığını engelliyor gibi görünüyor:

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)

Birisi bana böyle bir istisna sorununu nasıl giderebilir veya daraltabilir? Uygulama kaynak dosyalarımın hiçbirine referans alamıyorum. Google'da dolaşmaya çalıştım ve söylediği bağlantılardan, http url'ye https yoluyla erişmeye çalışıyorsunuz, bu da olası görünmüyor. Uygulama tek bir Tomcat 8 örneğinde çalıştığında bu hatayı almıyorum. Bunu sadece çok sunuculu bir ortamda alıyorum.

Ayrıca, nedeni tanımlamaya yardımcı olursa, her sayfaya gömdüğüm meta etiketleri de paylaşıyorum.

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

Ayrıca, temel olarak yukarıdakiyle aynı olan birkaç sayfada aşağıdakileri kullanıyorum:

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

Birisi sorun giderme girişimime yön vermede yardımcı olsa bile, şu anda hiçbir fikrim yok, nereye bakacağım gibi yararlı olacaktır.

Şimdiden teşekkürler.

Yanıtlar:


267

HTTPS etkin olmayan uç noktada istemciden HTTPS isteğini yürütmeye çalıştığınızda bu özel durum oluşabilir . Sunucu ham verileri beklerken istemci istek verilerini şifreleyecektir.


1
Bu cevabı anladığımdan emin değilim. Spring Boot 1.5.1 uygulamam var ve günlüğümde bu istisnayı gördüm. Uygulamam yalnızca 8443 numaralı bağlantı noktasındaki (443 numaralı bağlantı noktasından yönlendirilen) SSL için yanıt veriyor ve SSL için yalnızca bir bağlayıcıya sahip. Birisinin 443 numaralı bağlantı noktasında https: yerine http: denediğini mi söylüyorsunuz?
Jim Archer

5
Böyle bir istisna, sunucunun beklediği ve aldığı şey arasında bir uyumsuzluk olduğunda ortaya çıkar. Söyledikleriniz olası senaryolardan biri. Belki sunucunuzda https'de çalışmayan bir uç nokta var, ancak birisi bu şekilde erişmeye çalışıyor?
Petar Tonev

1
Merhaba Peter ... Sorun, birisinin 80 numaralı bağlantı noktasını 8443 numaralı bağlantı noktasına iletmek için bir IP Tabloları kuralı oluşturmasıyla sonuçlandı, bu nedenle 80 numaralı bağlantı noktasında http'yi kullanarak siteyi vuran herkes bu hataya neden oldu. 8080 numaralı bağlantı noktasını 8443 numaralı bağlantı noktasına yeniden yönlendirmek için bir Tomcat konektörü ekledik ve 80 numaralı bağlantı noktasını 8080 numaralı bağlantı noktasına yönlendirmek için IP Tabloları kuralını ayarladık ve sorun tamamen ortadan kalktı. Cevabınız için teşekkür ederiz!
Jim Archer

1
@PeterTonev: Nasıl yapılır (https'yi http || httpps'yi devre dışı bırak ||
crusy

1
@crusy İstisna işlemleri için burada size yardımcı olabilecek bir şey link
Petar Tonev

56

Yerel olarak test ettiğimde aynı istisnayı yaşadım. Sorun, isteğimdeki bir URL şemasıydı.

Değişiklik https:// to http:// in your client url.

Muhtemelen yardımcı olur.


2
Elbette çalışır, ancak HTTP üzerinden iletişimin güvenli olmadığını unutmayın.
Paramvir Singh Karwal

23

Yerel sunucuyu http : // localhost: 8080 / foo / bar ile çağırıyorsunuz . Https : // localhost: 8080 / foo / bar ile arayın . Bu sorunu çözer


Muhtemelen 8080'de https: // olmayacak. Aramayı https: // localhost: 8443 / foo / bar olarak değiştirin - İşte örnek bağlantı - Rodrigo R. Coelho
Rodrigo R. Coelho

9

Birisinin havalı kullanması durumunda:

Yürütmeyi başlatmadan önce Şemayı HTTPveya HTTPSihtiyaçlara bağlı olarak değiştirin .

Postacı:

URL adresine http://veya https://URL adresindeki URL Yolunu değiştirme


8

TLS sorunlarıyla ilgisi olmayan bu istisnayı aldım. Benim durumumda, Content-Length başlık değeri, gövde uzunluğuyla eşleşmedi.


2
Sana yeterince teşekkür edemem. Diğer tüm POST istekleri 400 hatasıyla başarısız oldu ve saçlarımı sökmeye hazırdım. content-lengthÜstbilgi göndermemenin bu sorunu çözdüğü ortaya çıktı.
Alexander Woodblock

2
Yerel geliştiriciye Postacı talepleri için 30-90 saniye gecikme alıyordum - çıkıyor, bu sorun oldu! Content-LengthBaşlığın devre dışı bırakılması gecikmeyi düzeltti.
Alok

1

Bu eski soruyu cevaplamak (yardımcı olabilecek diğerleri için)

httpd conf'inizi doğru şekilde yapılandırmak sorunu çözecektir. Eğer yoksa, herhangi bir httpd sunucusu kurun.

Yapılandırmam burada listeleniyor.

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

dosyayı yukarıdaki gibi düzenleyin ve httpd'yi aşağıdaki gibi yeniden başlatın

[smilyface@box002 ~]$ sudo service httpd restart


Ve sonra ile istek httpsistisnasız çalışacaktır.
Ayrıca istek ile httpyönlendirecek https! Telaşa gerek yok.


1

Bu hatayı krom tarayıcıda 2 şey yaparak çözdüm:

  1. Ctrl + Shift + Delete tuşlarına basın ve tüm tarama verilerini baştan temizledi.
  2. Chrome'un: Ayarlar -> Gelişmiş Ayarlar -> Proxy ayarlarını aç -> İnternet Özellikleri'ne gidin, ardından İçerik penceresine gidin ve SSL Durumunu Temizle Düğmesine tıklayın.

Bu sitede bu bilgiler ve diğer seçenekler de bulunmaktadır: https://www.thesslstore.com/blog/fix-err-ssl-protocol-error/


1

Bu eski bir iş parçacığı olduğunu biliyorum, ama bu ne zaman olabilir belirli bir durum vardır:

VPC bağlantısıyla birleştirilmiş AWS api ağ geçidi kullanıyorsanız ve Ağ Yük Dengeleyici v2 proxy protokolünü etkinleştirdiyse, 400 Hatalı İstek de gerçekleşir.

Anlamak için bütün öğleden sonra bana aldı, bu yüzden birine yardımcı olabilirse memnun olurum :)


0

Aynı istisnayı alıyordum, her sayfa yüklenirken,

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)

Sayfa URL'mden birinin http yerine https olduğunu buldum, aynı değiştirdiğimde hata gitti.


0

Bu genellikle , uygulamanın dağıtıldığı sunucu tarafından desteklenmeyen bir URI şeması kullandığınızda olur . Bu nedenle, sunucunuzun tüm şemaları desteklediğini kontrol etmek ve isteğinizi URIbuna göre değiştirmek veya sunucunuza bu şema için destek eklemek isteyebilirsiniz. Başvurunuzun kapsamı, bu konuda karar vermenize yardımcı olmalıdır.


0

8080 bağlantı noktasında Proxy'yi çalıştırmak için ssh tünelinde SOCKS'te kullanılan aynı bağlantı noktasına sahip olduğumda ve sunucum ve firefox tarayıcı proxy'im bu bağlantı noktasına ayarlandığında ve bu sorunu aldığında bana oldu.


0

Benim durumumda bu hatadan kurtulmak için tarayıcı geçmişini / çerezleri temizlemem gerekti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.