Session在ajax请求上不起作用[如何利用会话变量计算ajax请求的次数]
Session在ajax请求上不起作用[如何利用会话变量计算ajax请求的次数]
我有以下的PHP代码,用于统计每次访问页面的次数。如果我直接调用页面,它会计数特定的次数。如果我进行Ajax调用,它总是从1开始计数。
我知道通过阅读这篇文章,Ajax调用和直接调用是相同的:Do AJAX requests retain PHP Session info?
在页面打开的同时,如何计算每个Ajax调用的次数?
我正在做一个简单的jquery ajax调用:
我创建了测试文件testfile.html,只是一个黑屏。在桌面上点击并在控制台中查看计数器,php文件在这里。
问题:在ajax请求中无法使用会话(session)变量的原因是什么?如何解决这个问题?
问题出现的原因是由于域名不同导致的。由于安全原因,cookie是与域名相关的。在http://huntinggrounds.de/aa.html页面上设置的cookie在http://www.huntinggrounds.de/aa.html页面上无法使用,这取决于配置。
为了解决这个问题,不要在ajax中设置完整的URL,而是使用相对URI。
解决方法如下:
$.get( "/collect?"+setParameter(defs), function( data ) { try { console.log("New count is : ",data); } catch(e) { // if there is no response console.log( "No answer : ", data); } })
如果你想允许子域共享会话的cookie,可以更新默认的PHP配置。可以在PHP页面的顶部(session_start之前)添加以下代码:ini_set('session.cookie_domain', '.huntinggrounds.de' );
。如果ini_set不允许使用,可以尝试直接将此指令放入php.ini中。
还可以尝试使用以下代码:session_set_cookie_params(0, '/', '.huntinggrounds.de');
。
如果无法访问php.ini,可以检查是否生效:session_set_cookie_params(0, '/', '.huntinggrounds.de');
。
可以在聊天室中继续讨论。
问题的出现原因:ajax请求无法使用会话变量的原因可能是由于域路径(www.子域与无子域)导致会话cookie出现问题。可能会在浏览器的cookie中看到两个cookie,一个用于www.子域,一个用于无域的网站。
解决方法:
1. 在服务器端进行用户身份验证,可以使用会话中的用户ID或IP地址。
2. 在数据库中使用用户ID作为唯一字段,也可以结合其他字段(如日期或访问的URL)。
3. 创建一个名为'views'的数值字段,可能还可以为访问的URL创建一个字段。
4. 在每个ajax请求中,从数据库中获取用户记录,增加views字段的值,并保存其他需要的数据。
可以跳过保存在会话中的步骤,因为如果用户关闭浏览器,您将丢失计数。此外,您如何判断何时将其保存到数据库中?除非使用类似ajax调用的心跳,否则无法告知服务器端何时断开连接。可以实现一个类似的系统,通过使用记录ID和用户ID作为键,记录上次查看时间的时间戳,以便在ajax调用发生时获取上次查看时间(如果时间与当前时间相差几分钟以内),并在一个单独的字段中保存总共花费的秒数。然后,通过一些基本的数学运算,可以将新的经过时间添加到总时间中,从而相对准确地跟踪记录的打开时间。
问题的出现原因是在尝试从一个没有这些cookie的第二个域访问一个域时发生的。有一个根本问题是两个域都提供页面,www和非www访问计算为两个站点,这会导致搜索引擎的内容重复惩罚。
解决方法是只使用一个URL作为规范,并重定向另一个URL。可以通过.htaccess文件或者如果没有服务器访问权限,则可以在配置文件中(在每个页面加载之初)使用以下代码来实现:
if ('www.' != substr($_SERVER['SERVER_NAME'], 0, 4)) { header('HTTP/1.1 301 Moved Permanently'); header('Location: http://www.'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']); exit(); }
这样就可以解决通过将非www访问重定向到www访问的问题,并避免了搜索引擎的内容重复惩罚。