会话变量未保存在iphone上

时间:2013-03-29 22:02:27

标签: php iphone ajax codeigniter mobile-safari

更新

我正在使用.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->session->set_userdata('current_email', $email);似乎没有在IPHONE上设置会话,因此将用户重定向回登录页面。我猜也许是因为iphone safari cookies被自动禁用或类似的东西。有什么方法可以解决这个问题,以便在手机上运行?

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 function

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');
                }

2 个答案:

答案 0 :(得分:0)

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

您只需要在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自动处理,无需在实际代码中进行任何更改。

<强>更新

在谷歌搜索引导我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 '?'

答案 1 :(得分:0)

是否将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"'); 
?>

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