我維護一個電子商務網站的代碼,他們使用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之後重定向第一次訪問。有沒有其他方法?
無條件啓動會話...?如果您需要,您仍然可以檢查以後是否接受Cookie。 – CBroe
我在想這是我唯一的選擇。我查看了JavaScript cookie驗證,但由於JavaScript可以禁用,我不喜歡這種方法。我感到驚訝的是,這個過程似乎沒有任何行業廣泛接受的方法。 在設計網站及其互動時,如果您接受當前驗證的「接受方法」,則在進行驗證之前,首次訪問總是必須分兩步進行。例如,如果您正在將某人發送到某個頁面,那麼您需要立即捕獲某些內容給該會話? – peteb
會話可以在沒有cookie的情況下工作(並且作爲默認的回退,他們通常會這樣做 - 直到自動確定cookie支持爲止)。 – CBroe