Internet Explorer中的Codeigniter会话问题

时间:2012-04-23 21:56:21

标签: php internet-explorer codeigniter session

我有一个使用CI会话类的CI应用程序。这是我遇到问题的过程:

  1. 用户加载页面
  2. 从DB
  3. 获取记录的Ajax请求
  4. 使用该记录的ID&设置userdata变量。做各种数据库的东西
  5. 用户刷新页面
  6. Ajax请求根据前一条记录的会话变量从DB获取记录(同一条记录不能连续两次传回)
  7. 将userdata变量重新设置为新记录的ID
  8. 等。等

    这在chrome和FF中完美运行。但显然当我来IE浏览时 - 不起作用。

    执行ajax请求并检索第一条记录。此时已设置会话变量。用户刷新但仍保留相同的记录。

    此时如果我清除会话cookie并刷新新记录,则会被检索。

    我尝试过改变:

    $config['sess_cookie_name']     = 'ci_session';
    

    $config['sess_cookie_name']     = 'cisession';
    

    就像我在另一篇文章中看到的但没有运气。还尝试使用DB进行会话存储,但仍然没有运气。

    以下是问题页面:http://givestream.co.uk/stream

    在Chrome或FF中加载它,然后刷新或点击“下一步”按钮,你会看到它检索一个新的慈善机构。在IE中尝试这个,除非你清除会话cookie,否则它不起作用。

    获取记录的JS函数:

    function get_matches(){
        var charity;
        var user_total;
        jQuery.get("/stream/get_charity/", function(data){
    
            charity = data.charity;
            user_total = charity.user_totals;
    
            /** CHANGE URL **/
    
            if (history.pushState) {
                window.history.pushState("object or string", "Title", "/stream/"+charity.slug);
            }
    
            /*****************/
    
            // can user accept?
            if(charity.can_donate == 0){
                // No
                jQuery('.alert-message').show();
            } else{
                jQuery('.alert-message').hide();
            }
    
            // Charity Binding
            jQuery('p#char_modal_description').html(charity.description);
            jQuery('.char_more_link').attr('id', charity.id);
            jQuery('h1#char_name').html(charity.char_name);
            jQuery('h2#char_modal_header').html(charity.char_name);
            jQuery('p#char_desc').html(charity.description);
            jQuery('#website').html('<label>Website</label><a href="'+charity.website+'" style="color:#08C;" target="_blank">'+charity.website+'</a>');
            jQuery('#char_total').text('\u00A3'+charity.total);
            jQuery('#donors').html(charity.recent_donors);
            jQuery('#fans').html(charity.recent_fans);
    
            if (typeof user_total !== 'undefined') {
                jQuery('#total_char_month').text('\u00A3'+user_total.total_char_month);
                jQuery('#total_char_alltime').text('\u00A3'+user_total.total_char_alltime);
                var has_user_seen_stream_notice = user_total.has_user_seen_stream_notice;
    
                if(has_user_seen_stream_notice == false){
                    jQuery('#stream_help').show();
                } 
            } else{
                jQuery('#total_char_month').text('\u00A3'+0);
                jQuery('#total_char_alltime').text('\u00A3'+0);
            }
    
            /** TWITTER SHARE BUTTON CHANGE URL **/
    
            var twitter = '<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://givestream.co.uk/stream/'+charity.slug+'" data-via="givestreamuk" data-hashtags="socialgiving">Tweet</a>';
            jQuery('#twitter_share').html(twitter);
    
            var jstext = '!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");';
    
            var script   = document.createElement("script");
            script.type  = "text/javascript";
            script.text  = jstext;
            jQuery('#twitter_share').append(script);
    
            // *************************************//
    
    
            /** FACEBOOK SHARE WIDGET **/
    
                var fb = '<iframe src="//www.facebook.com/plugins/like.php?href=http://givestream.co.uk/stream/'+charity.slug+'&amp;send=false&amp;layout=standard&amp;width=280&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font&amp;height=35&amp;appId=119083868224729" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:280px; height:35px;" allowTransparency="true"></iframe>';
                jQuery('#fb_share').html(fb);
    
    
            // ***********************//
    
    
            jQuery('#char_website').html(charity.website);
    
            jQuery('#sectors').html('<label>Tags</label>'+charity.sectors);
            jQuery('#permalink').val('http://givestre.am/stream/'+charity.slug);
    
            jQuery('#refresh').activity(false);
    
            get_charity_gallery();
            get_charity_shouts();
    
        }, 'json');
    
        return;
    }
    

4 个答案:

答案 0 :(得分:5)

固定!

这似乎不是一个ci_session问题。

我挖得更深一些并添加了

log_message('info', 'queried!-'.$_SERVER['HTTP_USER_AGENT']);

进入执行json响应的控制器,看看ajax请求是否实际到达控制器,结果发现IE ajax获取请求实际上都没有发送到控制器。

事实证明,即使IE网络检查员确认了get请求,它实际上也在使用缓存的ajax响应。

我添加了

jQuery.ajaxSetup ({
    // Disable caching of AJAX responses
    cache: false
});

到js脚本和繁荣的顶部。排序

感谢@Laurencei的帮助!

答案 1 :(得分:3)

通过设置sess_expire_on_close = true来尝试此操作。我在配置中用这个设置解决了我的问题。

答案 2 :(得分:2)

尝试设置 $ config ['sess_match_useragent'] = FALSE;

答案 3 :(得分:1)

忽略上面的评论 - 这是CI问题,而不是JS问题。

首先,如果未正确设置“cookie_domain”,IE会话也可能失败 - 特别是如果它留空。所有其他浏览器将继续工作,但不是IE。

其次 - 试试这个解决方案: http://codeigniter.com/forums/viewthread/203821/

第三 - 使用这个解决方案(我使用它 - 非常好用): http://codeigniter.com/forums/viewthread/170123/ (大约一半 - WanWizard发布的MY_Session文件