2009-02-21 35 views
24

Tôi là một nhà phát triển .NET bắt đầu vọc trong Java.Tại sao giá trị cookie với khoảng trắng đến phía khách hàng bằng dấu ngoặc kép?

Trong .NET, tôi có thể đặt giá trị của cookie thành chuỗi có khoảng trắng: new HttpCookie("myCookieName", "my value") - và khi tôi đọc giá trị đó ở phía máy khách (JavaScript), tôi nhận được giá trị tôi mong đợi giá trị).

Nếu tôi làm điều tương tự trong một servlet Java - new Cookie("myCookieName", "my value"), tôi nhận được giá trị bao gồm cả dấu ngoặc kép ("giá trị của tôi").

Tại sao lại có sự khác biệt? Tui bỏ lỡ điều gì vậy? Mọi người xử lý thế nào trong thế giới Java? Bạn có mã hóa giá trị và sau đó bạn giải mã ở phía máy khách không?

Trả lời

2

Có thể nó phải liên quan đến cách Java mã hóa cookie. Tôi đề nghị bạn thử gọi setVersion(1) trên cookie mới và xem liệu nó có phù hợp với bạn hay không.

+0

'setVersion (1)' sẽ không hoạt động đối với IE. –

5

Theo như tôi biết, không gian phải được mã hóa trong cookie. Các trình duyệt khác nhau phản ứng khác nhau với các cookie chưa được mã hóa. Bạn nên mã hóa URL cookie của mình trước khi cài đặt.

String cookieval = "my value"; 
String cookieenc = URLEncoder.encode(cookieval, "UTF-8"); 
res.addCookie(new Cookie("myCookieName", cookieenc)); 

ASP.NET tự động mã hóa, trong Java bạn phải tự làm. Tôi nghi ngờ các dấu ngoặc kép bạn thấy được thêm bởi tác nhân người dùng.

0

Thử sử dụng setVersion (0).

HttpCookie cookie = new HttpCookie("name", "multi word value"); 
System.out.println(cookie.toString()); 

in:

name = "nhiều giá trị từ"

Nhưng sau khi cài đặt

cookie.setVersion(0); 
System.out.println(cookie.toString()); 

in:

name = nhiều từ giá trị

Việc mã hóa cũng là một ý tưởng hay, nhưng các dấu ngoặc kép xung quanh giá trị đó là một vấn đề độc lập.

+1

Phiên bản 0 không cho phép khoảng trắng trong cookie. –

40

Khi bạn thiết lập một giá trị cookie với một trong các giá trị sau như đã đề cập trong Cookie#setValue(),

Với Version 0 cookies, các giá trị không được chứa khoảng trắng, dấu ngoặc, dấu ngoặc đơn, dấu bằng, dấu phẩy, dấu ngoặc kép , dấu gạch chéo, dấu chấm hỏi, dấu, dấu hai chấm và dấu chấm phẩy. Giá trị trống có thể không hoạt động theo cùng một cách trên tất cả các trình duyệt.

thì vùng chứa trung bình sẽ ngầm đặt cookie thành phiên bản 1 (RFC 2109 spec) thay vì phiên bản mặc định 0 (Netscape spec). Hành vi không được API Servlet chỉ định, vùng chứa này miễn phí để thực hiện nó (ví dụ: nó có thể ném một số IllegalArgumentException). Theo như tôi biết, Tomcat, JBoss AS và Glassfish hành xử tất cả như nhau liên quan đến việc thay đổi hoàn toàn phiên bản cookie. Đối với ít nhất Tomcat và JBoss AS, đây là hậu quả của các bản sửa lỗi cho this security issue.

Một phiên bản 1 cookie cái nhìn như thế này:

name="value with spaces";Max-Age=3600;Path=/;Version=1

trong khi một phiên bản 0 tương thích nhìn Cookie như thế này:

name=value%20with%20spaces;Expires=Mon, 29-Aug-2011 14:30:00 GMT;Path=/

(lưu ý rằng một giá trị URL mã hóa có giá trị trong phiên bản 0)

Lưu ý quan trọng là Microsoft Internet Explorer không hỗ trợ cookie phiên bản 1. Thậm chí không phải bản phát hành IE 11 hiện tại. Nó sẽ giải thích các dấu ngoặc kép là một phần của toàn bộ giá trị cookie và sẽ xử lý và trả lại cho phù hợp. Nó không hỗ trợ thuộc tính Max-Age và nó sẽ bỏ qua nó hoàn toàn gây ra rằng thời gian tồn tại của cookie mặc định cho phiên trình duyệt. Bạn dường như đang sử dụng IE để kiểm tra việc xử lý cookie của ứng dụng web của bạn.

Để hỗ trợ MSIE là tốt, bạn thực sự cần phải URL mã hóa và giải mã URL-giá trị cookie chính mình nếu nó chứa có thể nhân vật đó là không hợp lệ cho phiên bản 0.

Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8")); 
// ... 

String value = URLDecoder.decode(cookie.getValue(), "UTF-8")); 
// ... 

Để hỗ trợ cookie phiên bản 1 cho đối tượng trên toàn thế giới, bạn sẽ thực sự chờ Microsoft sửa lỗi thiếu hỗ trợ MSIE và trình duyệt có sửa chữa đã trở thành chủ đạo. Nói cách khác, nó sẽ mất độ tuổi (cập nhật: tính đến nay, 5+ năm sau, dường như điều này sẽ không xảy ra). Trong khi đó, bạn nên gắn bó với các cookie tương thích phiên bản 0.

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