【问题标题】:session variable is not being saved on the iphone会话变量未保存在 iPhone 上
【发布时间】:2013-03-20 16:15:54
【问题描述】:

更新:

当用户访问我的网站时,我使用 .htaccess 将用户重定向到包含所有这些文件的特定文件夹 (/var/www/html/test)。 .htaccess 看起来像这样

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule (?!^test(/.*|)$)^(.*)$ /test/$1 [NC,L]
</IfModule>

当我将所有文件移动到 /var/www/html 并评论 .htaccess 行时。iphone 上的会话开始工作...我不知道为什么.. 有没有办法用 .htaccess 解决这个问题?

---- 更新结束 -----

我有一个调用用户登录函数的 ajax 函数,如果用户/密码正确,它会登录用户。它适用于台式机、笔记本电脑、三星 s3 手机,但不适用于 IPHONE! $this-&gt;session-&gt;set_userdata('current_email', $email); 似乎没有在 IPHONE 上设置会话,因此将用户重定向回登录页面。我猜这可能是因为 iphone safari cookie 被自动禁用或类似的东西。解决这个问题的最佳方法是什么,以便它在手机上运行?

ajax:

$.ajax({
                url: site_url+"/user/login/"+email,
                type: "post",
                data: 'password='+password+'&email='+email,
                success: function(response){    
                    if(response == "success"){
                      window.location.href = site_url+"/user/invites";
                    }else{
                      alert("Password is not valid");
                    }   
                },  
                error: function(){
                }   
            }); 

/user/login php codeigniter函数

public function login($email)
        {

                $password = $this->input->post('password');

                if($email != NULL){

                        $this->load->helper('string');
                        $this->load->model('user_model');
                        $this->load->library('session');

                        $user_status = $this->user_model->check_status($email, $password);

                        if (is_array($user_status) && $user_status['is_active']) {

                                $this->session->set_userdata('current_email', $email);
                                $this->session->set_userdata('user_id', $user_status['id']);
                                $this->session->set_userdata('unique_id', $user_status['unique_id']);
                                $this->session->set_userdata('is_active', 1);

                                echo "success"; die();
                        }

                } die();

        }

/用户/邀请

 public function invites($unique_id = NULL)
        {

                if($this->session->userdata('current_email') != FALSE){

                        $data['unique_id'] = $this->session->userdata('unique_id');
                        $data['current_email'] = $this->session->userdata('current_email');

                        if($data['unique_id']){

                                $data['invited_users'] = $this->user_model->get_invited_users($this->session->userdata('user_id'));

                                $data['user_details'] = $this->user_model->get_user_details($this->session->userdata('user_id'));

                        $this->template->write_view('header', 'templates/header2', $data);
                        $this->template->write_view('content', 'invites', $data);

                        // Render the template
                        $this->template->render();

                }else{ 
                        redirect('welcome/index/1','refresh');
                }

【问题讨论】:

  • 这可能是缓存问题,请参阅我的更新答案以了解可能的方法
  • 您是否尝试过使用原生 php 会话 $_SESSION['current_email'] = $email 而不是 codeigniters 方法?
  • @CodeCrack 您是否使用加密密钥进行会话?你能发布你的config.php关于会话吗?
  • 尝试在您的配置中将 sess_match_useragent 设置为 false,看看是否有任何不同

标签: php iphone ajax codeigniter mobile-safari


【解决方案1】:

ajax 调用是否发送到外部域?

如果是这样,这可能与安全问题有关。 见:http://drupal.org/node/918194

我只在IE中处理过这个问题,我不知道这是否会发生在iOS上。

所以尝试在 ajax 接收端脚本中添加以下内容:

<?php
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); 
?>

注意:确保此页眉放在所有必要的页面上,并且出现在脚本的最开头。

【讨论】:

    【解决方案2】:

    我可以提出一个替代方案:使用数据库作为会话处理程序。

    您只需要在 application/config/config.php 文件中启用它:

    $config['sess_use_database'] = TRUE;
    

    您需要一个表来存储保存的会话,手册建议使用此架构:

    CREATE TABLE IF NOT EXISTS  `ci_sessions` (
        session_id varchar(40) DEFAULT '0' NOT NULL,
        ip_address varchar(45) DEFAULT '0' NOT NULL,
        user_agent varchar(120) NOT NULL,
        last_activity int(10) unsigned DEFAULT 0 NOT NULL,
        user_data text NOT NULL,
        PRIMARY KEY (session_id),
        KEY `last_activity_idx` (`last_activity`)
    );
    

    除此之外,您无需执行任何操作,所有需要的查询均由 CI 自动处理,无需对您的实际代码进行任何更改。

    更新:

    在 google 上的搜索让我找到了this CI forum thread(和this SO answer)。原因可能是 safari 缓存了 AJAX 请求,因此您需要在 url 中添加时间戳,问题应该得到解决。示例:

    var timestamp = new Date().getTime();    
    $.ajax({
         url: site_url+"/user/login/"+email+"?"+timestamp, // Or use '/' instead of '?'
    

    【讨论】:

    • 他们已经设置好了。只是不在 iPhone 上!我正在尝试在没有 db 会话的情况下找到解决方法。
    • 我之前尝试过,但没有成功。我之前也看到过该解决方案,但我不确定这是否适用于我的案例。
    • 我什至尝试了 DB 会话解决方案,但由于无法检测到电子邮件,iphone 仍然重定向到主页
    • 您是否尝试在超过 1 部 iPhone 上对此进行测试,以确保它不仅仅是那部有问题的手机?
    猜你喜欢
    • 2014-05-17
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多