2016-11-23 22 views
0

我維護一個電子商務網站的代碼,他們使用osCommerce v2.2 RC2的高度修改版本。注意到會話在新用戶訪問網站的第2頁之前未啓動的問題。使用setcookie檢測cookie集沒有頁面重裝

查看代碼,在開始會話之前,它會嘗試設置一個cookie。如果它檢測到它啓動會話的cookie。沿着這條線的東西:

setcookie('cookie_test', 'please_accept_for_session', time()+60*60*24*30, $cookie_path, $cookie_domain); 

if (isset($_COOKIE['cookie_test'])) { 
     session_start(); 
... 

我發現這裏的article談到有關這樣的情況下,它指出:

第一次只告訴瀏覽器設置cookie,在當時,請求頭中沒有cookie數據(可以從$ _COOKIE獲得)。

這解釋了爲什麼需要兩個頁面加載才能啓動會話。一個設置cookie,另一個從瀏覽器獲取cookie的設置。

我的問題是,究竟有沒有經過兩次頁面加載來檢測cookie是否成功設置在用戶瀏覽器上?

我發現這個question並沒有完全回答我的問題。投票最高的解決方案是:

setcookie('uname', $uname, time()+60*30); 
$_COOKIE['uname'] = $uname; 

這可能使「工作」,但它並沒有忠實地告訴我,該腳本能夠成功設置cookie。

我也發現了這個question,即建議訪問headers_list找到Cookie信息,像這樣:

function getcookie($name) { 
    $cookies = []; 
    $headers = headers_list(); 
    // see http://tools.ietf.org/html/rfc6265#section-4.1.1 
    foreach($headers as $header) { 
     if (strpos($header, 'Set-Cookie: ') === 0) { 
      $value = str_replace('&', urlencode('&'), substr($header, 12)); 
      parse_str(current(explode(';', $value, 1)), $pair); 
      $cookies = array_merge_recursive($cookies, $pair); 
     } 
    } 
    return $cookies[$name]; 
} 
// [...] 
setcookie('uname', $uname, time() + 60 * 30); 
echo "Cookie value: " . getcookie('uname'); 

這又似乎並沒有被驗證cookie的設置成功。所有這些似乎都是搜索正在發送給瀏覽器的cookie值的cookie值。

我能想到的唯一解決方案是在設置cookie之後重定向第一次訪問。有沒有其他方法?

+0

無條件啓動會話...?如果您需要,您仍然可以檢查以後是否接受Cookie。 – CBroe

+0

我在想這是我唯一的選擇。我查看了JavaScript cookie驗證,但由於JavaScript可以禁用,我不喜歡這種方法。我感到驚訝的是,這個過程似乎沒有任何行業廣泛接受的方法。 在設計網站及其互動時,如果您接受當前驗證的「接受方法」,則在進行驗證之前,首次訪問總是必須分兩步進行。例如,如果您正在將某人發送到某個頁面,那麼您需要立即捕獲某些內容給該會話? – peteb

+0

會話可以在沒有cookie的情況下工作(並且作爲默認的回退,他們通常會這樣做 - 直到自動確定cookie支持爲止)。 – CBroe

回答

0

下面是答案:

<?php 

function set_cookie($name, $value) { 
    if (!isset($_COOKIE[$name]) || ($_COOKIE[$name] != $value)) { 
     $_COOKIE[$name] = $value; 
    } 
    setcookie($name, $value, strtotime('+1 week'), '/'); 
} 

// Usage: 
set_cookie('username', 'ABC'); //Modify the value to see the change 

echo $_COOKIE['username'];