2008-12-11 33 views
6

Tôi có một cookie được tạo từ một servlet và tôi muốn liên tục - tức là, đặt cookie, đóng IE, khởi động lại, và vẫn có thể đọc cookie. Mã mà tôi đang sử dụng là:Cookie liên tục từ một servlet trong IE

HttpServletResponse response = 
    (HttpServletResponse) FacesContext.getCurrentInstance() 
    .getExternalContext().getResponse(); 

Cookie cookie = new Cookie("someKey", "someValue"); 
cookie.setMaxAge(7 * 24 * 60 * 60); 
response.addCookie(cookie); 

Điều này hoạt động tốt trong firefox, nhưng trong IE 6/7, cookie không được lưu giữa các lần khởi động lại trình duyệt. Tôi đã kiểm tra mọi thứ mà tôi có thể nghĩ đến trong cài đặt của mình, nhưng không thể tìm ra nguyên nhân khiến cookie bị xóa. Theo như tôi biết, gọi setMaxAge với một số dương làm cho cookie bền bỉ. Bất kỳ ý tưởng tại sao điều này sẽ xảy ra sai?

Sửa

Tôi đã xác minh, sử dụng các thông tin lừa hơn đề nghị của Olaf, rằng cookie đang nỗ lực để được thiết lập như là một cookie phiên, không phải là một cookie; độ tuổi tối đa được đặt thành "kết thúc phiên". Vì vậy, nó không có vẻ như độ tuổi tối đa đang được thiết lập cho IE - Tôi đã xác minh rằng trong Firefox, độ tuổi tối đa được thiết lập chính xác. Tôi vẫn không biết chuyện gì đang diễn ra.

Trả lời

6

Tôi không biết gì về Java hoặc servlets, nhưng IE sẽ chỉ tồn tại một cookie nếu nó có một ngày Hết hạn, thiết lập max-age được không đủ, IE sẽ tiếp tục đối xử với nó dưới dạng cookie phiên.

+0

Vâng, có vẻ như đây là vấn đề. Nhìn vào các tiêu đề trong Fiddler, Max-Age đang được thiết lập, nhưng không hết hạn. Tôi đã sửa đổi các tiêu đề của câu trả lời thông qua Fiddler và thêm thuộc tính Expires và cookie của tôi đã được lưu. Tuyệt vời - bây giờ tôi chỉ cần tìm một cách để thêm thuộc tính Expires vào cookie từ Java. –

1

Vài đề xuất.

  1. Bạn có sử dụng fqdn để truy cập trang web không?
  2. sử dụng fiddler để kiểm tra xem cookie trông như thế nào trong phản hồi http.
  3. Kiểm tra xem các trang web khác trên internet có lưu trữ cookie thành công hay không.
0

Vì tôi không sử dụng cửa sổ, đây là một số bộ nhớ bị hỏng: Nếu bạn đặt cài đặt cookie IE thành "yêu cầu quyền" mỗi lần đặt cookie - không hiển thị cookie được bao lâu có giá trị? Ngoài ra, bạn có thể muốn thêm trang web vào một khu vực bảo mật khác (địa phương hoặc bất kỳ tên nào được gọi) để nhận các cài đặt hoàn toàn khác và thử lại sau đó.

Hope this helps ...

1

Điều này http://www.mail-archive.com/[email protected]/msg52249.html có câu trả lời nhưng không thực sự giải thích lý do.

Tức là, bằng cách mã hóa @ (là ký tự không được chấp nhận trong cookie phiên bản 0), cookie được gửi trong phản hồi có phiên bản được đặt là 0 (chấp nhận được IE) thay vì 1 (định dạng khác và do đó IE không được chấp nhận).

Vấn đề của tôi là giống nhau. Chúng tôi đã Base64 mã hóa giá trị cookie của chúng tôi và gửi nó xuống. Tuy nhiên, Base64 bao gồm các ký tự như '=' ... lại bất hợp pháp trong phiên bản 0 và do đó không thể chấp nhận đối với IE. Bí quyết còn lại đối với tôi là: một phần của ngăn xếp đủ thông minh để nhận ra rằng giá trị cookie không hợp lệ như cookie phiên bản 0 và quyết định gửi phản hồi dưới dạng cookie phiên bản 1 (bao gồm số phiên bản, các ký tự "không được chấp nhận", độ tuổi tối đa thay vì trường hết hạn, v.v.) Tôi không biết đó có phải là Tomcat, Faces, Spring hoặc javax.servlet khiến quyết định lật phiên bản hay không.

Dòng dưới cùng: Mã hóa URI trên giá trị của cookie sẽ đảm bảo cookie được đặt cho trình duyệt là phiên bản 0 và do đó được IE giữ nguyên.

+2

FWIW, http://blogs.msdn.com/ieinternals/archive/2009/08/20/WinINET-IE-Cookie-Internals-FAQ.aspx thực hiện rất tốt công việc giải thích các cookie từ quan điểm của IE ... nhưng tôi không thể đề cập đến điều đó trong bản gốc vì tôi là một người mới và đã bao gồm một liên kết. –

0

Tôi cũng gặp vấn đề tương tự với IE8, ngoại trừ việc cookie đã bền bỉ khi sử dụng http nhưng không phải khi sử dụng https. Giải pháp của Trí tuệ Rùa làm việc cho tôi, như tôi đã '=' và các ký tự khác trong đó đã vặn nó lên. Trước khi tôi mã hóa cookie https, nó hiển thị hết hạn vào "Kết thúc phiên". Sau khi mã hóa các giá trị, nó đã hết hạn với maxAge tôi trôi qua trong Dưới đây là những phương pháp tôi đã sử dụng để mã hóa/giải mã các giá trị cookie trước khi thiết lập và sau khi lấy nó:.

public static String encodeString(String s) { 
    String encodedString = s; 

    try{ 
     encodedString = URLEncoder.encode(s, "UTF-8"); 
    } catch (UnsupportedEncodingException e) {} 

    return encodedString; 
} 
public static String decodeString(String s) { 
    String decodedString = s; 

    try{ 
     decodedString = URLDecoder.decode(s, "UTF-8"); 
    } catch (UnsupportedEncodingException e) {} 

    return decodedString; 
} 
0
try{ 
     encodedString = URLEncoder.encode(s, "UTF-8"); 
    } catch (UnsupportedEncodingException e) {} 

    return encodedString;`a` 
} 
public static String decodeString(String s) { 
    String decodedString = s; 

    try{ 
     decodedString = URLDecoder.decode(s, "UTF-8"); 
    } catch (UnsupportedEncodingException e) {} 

    return decodedString; 
} 
Các vấn đề liên quan