2009-08-05 32 views
12

Trên trang web tôi đang cố gắng để giúp đỡ với, người dùng có thể gõ vào một URL trong trình duyệt, giống như chữ Hán sau,Xử lý Character Encoding trong URI trên Tomcat

http://localhost:8080?a=测试 

Trên máy chủ, chúng tôi nhận

GET /a=%E6%B5%8B%E8%AF%95 HTTP/1.1 

Như bạn thấy, mã UTF-8 được mã hóa, sau đó URL được mã hóa. Chúng ta có thể xử lý chính xác bằng cách thiết lập mã hóa thành UTF-8 trong Tomcat.

Tuy nhiên, đôi khi chúng ta có được mã hóa latin1 trên các trình duyệt nhất định,

http://localhost:8080?a=ß 

biến thành

GET /a=%DF HTTP/1.1 

Có anyway để xử lý này một cách chính xác trong Tomcat? Có vẻ như máy chủ phải thực hiện một số phỏng đoán thông minh. Chúng tôi không mong đợi để xử lý Latin1 chính xác 100% nhưng bất cứ điều gì là tốt hơn so với những gì chúng tôi đang làm bây giờ bằng cách giả sử tất cả mọi thứ là UTF-8.

Máy chủ là Tomcat 5.5. Các trình duyệt được hỗ trợ là IE 6+, Firefox 2+ và Safari trên iPhone.

+0

có thể trùng lặp của [Phát hiện mã hóa URI tự động trong Tomcat] (http://stackoverflow.com/questions/2657515/detect-the-uri-encoding-automatically-in-tomcat) – Ryan

Trả lời

5

Thật không may, mã hóa UTF-8 là "cần" trong URI specification, có vẻ như giả định rằng máy chủ gốc sẽ tạo tất cả các URL theo cách chúng sẽ có ý nghĩa với máy chủ đích.

Có một vài kỹ thuật mà tôi sẽ xem xét; tất cả đều liên quan đến việc phân tích cú pháp chuỗi truy vấn (mặc dù bạn có thể biết rõ hơn là liệu việc đặt mã hóa yêu cầu có ảnh hưởng đến chuỗi truy vấn đến ánh xạ tham số hay chỉ phần thân).

Trước tiên, hãy kiểm tra chuỗi truy vấn cho một "byte cao" duy nhất: một chuỗi UTF-8 hợp lệ phải có hai hoặc nhiều byte (Wikipedia entry có một bảng hợp lệ và không hợp lệ).

Ít đáng tin cậy hơn là tìm tiêu đề "Chấp nhận-Bộ ký tự" trong yêu cầu. Tôi không nghĩ tiêu đề này là bắt buộc (chưa xem xét thông số HTTP để xác minh) và tôi biết rằng Firefox, ít nhất, sẽ gửi toàn bộ danh sách các giá trị có thể chấp nhận được. Chọn giá trị đầu tiên trong danh sách có thể hoạt động hoặc có thể không.

Cuối cùng, bạn đã thực hiện bất kỳ phân tích nào trên nhật ký, để xem liệu một tác nhân người dùng cụ thể có thường xuyên sử dụng mã hóa này không?

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