2016-07-05 40 views
1

或換句話說:如何向客戶端發送來自服務器的消息以在頁面上執行一些js代碼?Cookie是向客戶提供服務器執行某些js代碼的指令的唯一方式嗎?

這不是一個Ajax請求,它是一個普通的GET瀏覽器服務器請求。

比方說,我有這樣的代碼在我的應用程序的前端JavaScript文件:

if(condition_1) { 
    FB.getLoginStatus(...) 
} 
else if(condition_2) { 
    PayPal.getLoginStatus(...) 
} 
else { 
    do smth else... 
} 

所以我想給那些condition_1condition_2指令與服務器的響應一起。這不是Ajax請求。這是一個從瀏覽器到服務器的簡單的GET請求。

目前只有我的腦海裏出現了餅乾。

1)服務器從瀏覽器收到GET請求。

2)我讀了餅乾。如果沒有一定的cookie與請求來了,我設置condition_1,否則我設置condition_2餅乾:

if(req.cookies["foo"] == "foo") { 
    res.cookies("foo", "condition_1") 
     .status(200) 
     .send() 
     .end(); 
} 
else if(req.cookies["foo"] == "bar") { 
    res.cookies("foo", "condition_2") 
     .status(200) 
     .send() 
     .end(); 
} 

3)一種服務器發送200響應返回給客戶端。

現在在瀏覽器我檢查這些Cookie(爲簡單起見,我做document.cookie.foo):

if(document.cookie.foo == 'condition_1') { 
    FB.getLoginStatus(...) 
} 
else if(document.cookie.foo == 'condition_2') { 
    PayPal.getLoginStatus(...) 
} 
else { 
    do smth else... 
} 

我的問題是,是cookies在這種情況下的唯一途徑?指示客戶端代碼執行某些條件

+2

呃,餅乾在這裏完全不相干。它們意味着與請求一起發送到服務器,而不是其他方式。因爲您已經在做GET請求,您可以直接回答並評估答案,或者如果您想繞過客戶端的請求,則可以使用websockets。 –

+0

有很多方法可以在請求響應週期之間傳遞一些「上下文」,如隱藏的HTML輸入元素。 – Ankur

+0

除了@Ankur所說的,服務器還可以使用動態生成的javascript作爲一個單獨的資源(一個.js文件)或嵌入的' – Arnauld

回答

1

Cookie存儲在您的瀏覽器中,並隨每個請求發送回服務器。它用於存儲客戶端設置,而不用於從服務器發送信息。

如果您正在使用一些可以在響應中設置cookie的服務器端技術,那麼爲什麼不使用它來發送要執行的腳本塊?

0

你正在做的事情更復雜,他們需要:Javascript提供eval

服務器可以簡單地回覆一個帶有表達式/語句的字符串以在瀏覽器上下文中進行評估。它不是在與Lisp相同的層次上開發的,但即使是在Javascript中,「數據」也可以直接「編碼」(不需要通過像Java或C++這樣的語言編寫解釋器來提高邏輯級別) 。

相關問題