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"));
// ...
và
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.
'setVersion (1)' sẽ không hoạt động đối với IE. –