2016-12-09 13 views
25

Tôi đang sử dụng Tomcat 8. Trong một trường hợp, tôi cần xử lý yêu cầu bên ngoài đến từ nguồn bên ngoài trong đó yêu cầu có thông số được phân tách bằng |.Tomcat 8 không thể xử lý yêu cầu với '|' trong các tham số truy vấn?

Yêu cầu là trông như thế này:

http://localhost:8080/app/handleResponse?msg=name|id|

Trong trường hợp này tôi nhận được lỗi sau.

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 
    at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:467) 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:667) 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:789) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

EDIT 1

Nó hoạt động với Apache Tomcat 8.0.30 nhưng không phải với Tomcat 8,5

+5

OK, tôi đoán bạn sẽ phải thoát khỏi nó –

+0

Bạn đã mất một cái nhìn vào RFC được tham chiếu? – clemens

Trả lời

29

Hành vi này được giới thiệu trong tất cả các phiên Tomcat chính:

  • Tomcat 7.0.73 , 8.0.39, 8.5.7

Đối với một sửa chữa nhanh chóng, bạn có thể hạ cấp xuống một trong các phiên bản cũ hơn hoặc đặt tùy chọn requestTargetAllow (see Jérémie's answer).

Dựa trên changelog, những thay đổi có thể ảnh hưởng đến hành vi này:

Tomcat 8.5.3:

Đảm bảo rằng các yêu cầu với tên phương pháp HTTP mà không phải là thẻ (theo yêu cầu của RFC 7231) bị từ chối với một phản ứng 400

Tomcat; 8.5.7:

Thêm kiểm tra bổ sung cho các ký tự hợp lệ vào phân tích cú pháp dòng yêu cầu HTTP để các dòng yêu cầu không hợp lệ bị từ chối sớm hơn.


Nhưng cuối cùng bạn muốn mã hóa URL của bạn trên máy khách:

encodeURI("http://localhost:8080/app/handleResponse?msg=name|id|") 
> http://localhost:8080/app/handleResponse?msg=name%7Cid%7C 

hay chỉ là chuỗi truy vấn:

encodeURIComponent("msg=name|id|") 
> msg%3Dname%7Cid%7C 

Nó sẽ đảm bảo bạn từ những nhân vật có vấn đề khác (list of invalid URI characters) .

+1

Cảm ơn, tôi vừa hạ cấp '' apache-tomcat-8.5.11'' thành '' apache-tomcat-8.0.30'' và nó hoạt động như một sự quyến rũ. –

3

thoát nó. Biểu tượng đường ống là biểu tượng được xử lý khác nhau theo thời gian và giữa các trình duyệt. Ví dụ: Chrome và Firefox chuyển đổi URL có đường ống khác nhau khi sao chép/dán chúng. Tuy nhiên, tương thích nhất, và cần thiết với Tomcat 8.5 có vẻ như, là để thoát khỏi nó:

http://localhost:8080/app/handleResponse?msg=name%7Cid%7C

30

Vì Tomcat 7.0.76, 8.0.42, 8.5.12 bạn có thể xác định thuộc tính requestTargetAllow để cho phép các ký tự cấm.

Thêm dòng này trong catalina.properties

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{} 
2

bạn URI được mã hóa theo UTF-8, nhưng Tomcat được giải mã chúng như ISO-8859-1. Bạn cần chỉnh sửa cài đặt trình kết nối trong tệp server.xml và thêm thuộc tính URIEncoding = "UTF-8".

hoặc chỉnh sửa thông số này trên application.properties bạn

server.tomcat.uri-encoding = utf-8

+0

Thuộc tính URIEncoding trên phần tử trong tệp server.xml đến một cái gì đó cụ thể (ví dụ: URIEncoding = "UTF-8") (https://wiki.apache.org/tomcat/FAQ/CharacterEncoding) – hwak

Các vấn đề liên quan