2016-11-23 55 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'];