考虑这种控制器方法
public function authenticate_session($user, $access_token) {
$this->output->enable_profiler(TRUE);
$user = $this->user_model->find_users(array("email" => $user, "access_token" => $access_token), "email, last_activity, access_token");
if ($user) {
$this->load->library('session');
$this->session->set_flashdata('post_data', $this->input->post(NULL));
redirect("v1/transactions_controller/pay");
} else {
redirect("v1/sessions/unauthenticated");
}
}
交易控制器中的付款方式
public function pay() {
$this->output->enable_profiler(TRUE);
$this->load->library('session');
var_dump($this->session->flashdata());
}
var_dump($this->session->flashdata());
给了我array(0) { }
我已经检查了我知道的所有地方,每个人似乎都说会话库中的flash_data对我来说是最好的选择。我需要在用户通过身份验证后将初始请求中的POST参数传递给事务控制器。如果我删除了重定向,只需执行var_dump($this->session->flashdata());
我就能看到我所期望的内容(来自上一个请求的POST数据),但是在重定向后它没有通过。
使用redirect("v1/transactions_controller/pay", "refresh");
似乎并没有真正转到新控制器,而是在身份验证控制器方法上刷新,但我确实看到了我的flashdata。难道我做错了什么?我的服务器是否应该以某种方式配置才能正常工作?
我已经将session_start()添加到我的index.php中,但是它引发了一个错误,因为它已经在会话库中,它由需要它的两个控制器加载。
我在config.php中的会话和cookie变量
$config['cookie_prefix'] = '';
$config['cookie_domain'] = 'localhost';
$config['cookie_path'] = '/';
$config['cookie_secure'] = FALSE;
$config['cookie_httponly'] = FALSE;
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
答案 0 :(得分:1)
您的问题在于会话配置。使用文件时,必须将驱动程序$config['sess_save_path']
设置为绝对路径,并且需要设置权限 - 可能设置为0700.会话数据保存在您设置的文件夹中的文件中。没有文件===没有会话数据。
另外,我建议改变一个cookie设置
$config['cookie_domain'] = '';
由于您似乎需要在整个网站中使用此功能,因此我建议您自动加载会话库。这在文件application/config/autoload.php
中完成。
找到文件中的$autoload['libraries]
项并将其设置为这样。
$autoload['libraries'] = array('session');
现在您不必将其加载到应用程序的任何其他位置。
文件中的注释说明了如何一次加载多个库。
出于安全考虑,建议将会话文件夹放在公共html文件之外。创建一个名为" sessions"的文件夹。与您网站的根目录处于同一级别。这通常是安装Codeigniter的文件夹。将此文件夹的权限设置为0700.所有者可能需要是" www-data"。如有疑问,请在htdocs文件夹中使用相同的所有者。
假设htdocs
您的根文件夹将其放在config.php的sessions部分中。
$config['sess_save_path'] = substr(FCPATH, 0, strpos(FCPATH, "htdocs/"))."sessions/";
常量FCPATH
由Codeigniter定义,是应用程序根目录的绝对路径 - index.php文件的存储位置。代码剥离" htdocs /"并用" sessions /"替换它。你应该好好去。如果您的root不是htdocs
更改" htdocs /" to" yourRootFolderName /"在strpos
。
在我的测试平台服务器上,FCPATH
定义的路径如下所示
/var/www/htdocs/
所以sessions文件夹位于
/var/www/sessions/
如果您在Windows计算机FCPATH
上使用WAMP或类似堆栈,可能看起来更像这样。
C:\wamp\www\htdocs\
答案 1 :(得分:1)
您需要为会话创建路径
https://www.codeigniter.com/user_guide/libraries/sessions.html#session-preferences
更改
$config['sess_save_path'] = NULL;
如下所示,并确保设置权限0700
$config['sess_save_path'] = APPPATH . 'cache/sessions/';
Codeigniter path functions definitions
EXT:PHP文件扩展名
FCPATH:前端控制器的路径(此文件)(CI的根目录)
SELF:THIS文件的名称(index.php)
BASEPATH:系统文件夹的路径
APPPATH:“应用程序”文件夹的路径
还要保存闪存数据
$this->session->keep_flashdata('item');
$this->session->keep_flashdata(array('item1', 'item2', 'item3'));
和codeigniter session tempdata
https://www.codeigniter.com/user_guide/libraries/sessions.html#tempdata
$config['cookie_domain'] = '.localhost';
答案 2 :(得分:0)
CodeIgniter支持“flashdata”或仅可用于下一个服务器请求的会话数据,然后自动清除。
是第一件事,这显然意味着你需要做一个新的服务器请求。重定向,刷新,链接或其他一些意思,用于将用户发送到下一个请求。
如果您在同一个请求中使用flashdata,为什么还要使用flashdata?您也可以不使用flashdata或使用常规会话。
答案 3 :(得分:0)
与大多数没有意义的事情一样,我发现只有一个小错误需要纠正:我需要在config.php中设置我的base_url();
$config['base_url'] = 'http://localhost/my_ci_site';