Tạo cookie JavaScript trên một miền và đọc nó trên các miền phụ


101

Dưới đây là một cookie JavaScript được viết trên máy tính của người dùng trong 12 tháng.

Sau khi chúng tôi đặt cookie trên miền chính của mình, chẳng hạn như example.com, nếu người dùng truy cập vào miền phụ như thế nào test.example.com, chúng tôi cần tiếp tục xác định hoạt động của người dùng trên miền phụ "thử nghiệm" của chúng tôi.

Nhưng với mã hiện tại, ngay sau khi họ rời khỏi www.example.comvà truy cập test.example.com, họ không còn được gắn cờ là "HelloWorld".

Có ai có thể giúp tôi mã của tôi để cho phép đọc cookie trên các miền phụ không?

<script type="text/javascript">
  var cookieName = 'HelloWorld';
  var cookieValue = 'HelloWorld';
  var myDate = new Date();
  myDate.setMonth(myDate.getMonth() + 12);
  document.cookie = cookieName +"=" + cookieValue + ";expires=" + myDate;
</script>

Câu trả lời:


209

Chỉ cần đặt các thuộc tính domainpathtrên cookie của bạn, như:

<script type="text/javascript">
var cookieName = 'HelloWorld';
var cookieValue = 'HelloWorld';
var myDate = new Date();
myDate.setMonth(myDate.getMonth() + 12);
document.cookie = cookieName +"=" + cookieValue + ";expires=" + myDate 
                  + ";domain=.example.com;path=/";
</script>

2
Tôi đang cố gắng thực hiện việc này trong localhost và tôi không thể thay đổi đường dẫn
Đi vào

7
@Enve - Các trình duyệt xử lý cookie localhost hơi khác so với các cookie khác. Hay đúng hơn, chúng xử lý tất cả cookie theo cách khiến việc làm việc với localhost trở nên khó khăn. Ví dụ: hãy xem stackoverflow.com/questions/1134290/… . Tôi đề nghị chỉnh sửa của bạn hoststập tin và răng cưa cái gì đó như myserver.localđể 127.0.0.1. Sau đó, bạn có thể sử dụng nó để truy cập máy chủ cục bộ của mình (và khi đặt cookie) và hy vọng mọi thứ sẽ hoạt động.
aroth

3
Tất cả các giá trị cookie bạn tạo và truy xuất phải là giá trị chuỗi. Các chuỗi có thể chứa các ký tự có thể làm xáo trộn bộ nhớ cục bộ khi cố gắng truy xuất chúng. Một điều tôi muốn đề xuất là sử dụng toàn cục encodeURI()& decodeURI()phương thức cho tên & giá trị cookie để xử lý bất kỳ chuyển đổi nào cần diễn ra. tức là document.cookie = encodeURI(cookieName) +"=" + encodeURI(cookieValue).
Dzeimsas Zvirblis

2
Nếu mã phía máy chủ của bạn được viết bằng C #, Rick Strahl cung cấp một phương pháp để lấy miền cơ sở, ví dụ: example.com, từ miền tại weblog.west-wind.com/posts/2012/Apr/24/…
CAK2

Rất tiếc, không sub.example.comthể đặt cookie để .example.comsử dụng javascript
Marinos An

27

Bạn muốn:

document.cookie = cookieName +"=" + cookieValue + ";domain=.example.com;path=/;expires=" + myDate;

Theo RFC 2109 , để có một cookie cho tất cả các miền phụ, bạn phải đặt .trước miền của mình.

Đặt đường dẫn = / sẽ có cookie trong toàn bộ miền được chỉ định (hay còn gọi là .example.com).


FWIW - Tôi nghĩ bạn cần xóa đoạn "path = expires =" và đặt nó thành "expires =".
malonso

3
Theo RFC 6265 mới hơn , không còn cần thiết phải bao gồm .phía trước miền.
Dan

6

Đây là một ví dụ hoạt động:

document.cookie = "testCookie=cookieval; domain=." + 
location.hostname.split('.').reverse()[1] + "." + 
location.hostname.split('.').reverse()[0] + "; path=/"

Đây là một giải pháp chung lấy tên miền gốc từ đối tượng vị trí và đặt cookie. Việc đảo ngược là do bạn không biết mình có bao nhiêu tên miền phụ nếu có.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.