我一直在遇到一些问题,在某个ajax调用之后创建空白会话。
调查后,似乎有2个同时发出的同时发出的函数调用需要进行会话验证。一个会失败,另一个会很好。
我能够解决这个问题,而不是让他们同时发射。但是我仍然不明白为什么它失败的原因。它是否与一个呼叫更新用户cookie和第二个呼叫无效?或者,当阅读数据库时,它会死亡吗?
我看了一下Session的核心课程,没有发现任何线索的原因。
如果有任何一个有同样的问题,我会感激任何关于如何调试的建议或原因。
谢谢!
编辑:
我原来说有408状态回报。这是一个无关的情况。
这是并行启动MyVar.refresh()的函数:
function (event) { var self$ = this.a$; var uid = this.b$.val(); var tid = this.c$.val(); var jqxhr = $.post('/controller1/index',{'uid':uid,'tid':tid,'action':true},function(re) { if(re.message != 'success') { MyVar.alert('<span class="msg_error sprite"></span>' + re.error); MyVar.refresh(); } },'json'); MyVar.refresh(); return stopDefault(event); };
可能的解决方案:
发现这个:http://codeigniter.com/forums/viewthread/102456/
显然它不适合ajax。一个解决方案是禁止会话更新,如果它是一个ajax调用;唯一的问题是我们的网站大多是用ajax建立的。
另外,刚刚把sess_time_to_update降低到非常频繁的程度,而且ajax做得很好。浏览器刷新也没有超时。不知道为什么如果会话ID已经在ajax调用和浏览器cookie从未更新过了。
解决方法
<?PHP /** * ------------------------------------------------------------------------ * CI Session Class Extension for AJAX calls. * ------------------------------------------------------------------------ * * ====- Save as application/libraries/MY_Session.PHP -==== */ class MY_Session extends CI_Session { // -------------------------------------------------------------------- /** * sess_update() * * Do not update an existing session on ajax or xajax calls * * @access public * @return void */ public function sess_update() { $CI = get_instance(); if ( ! $CI->input->is_ajax_request()) { parent::sess_update(); } } } // ------------------------------------------------------------------------ /* End of file MY_Session.PHP */ /* Location: ./application/libraries/MY_Session.PHP */
问题出在会话类的sess_update函数中,X秒后会生成一个新的session_id。每个页面都有一个session_id,如果session_id在ajax调用之前到期,则该调用将失败。
在/ application / libraries /中创建一个PHP文件,名称为MY_Session(或者你设置的任何前缀),粘贴这个代码就是这些。
此函数将覆盖会话类中的sess_update函数,如果该请求是由ajax进行的,则查看每个请求,并跳过sess_update函数。
它的一个坏主意将sess_expiration设置在更高的值。这是一个安全功能,可以保护您免受会话劫持
PD:我不太流利的英语,如果你不明白什么只是让我知道。