我在控制器中有这个代码
class Upload_center extends Controller
{
function __construct()
{
parent::Controller();
$this->load->model('auth_model') ;
if(!$this->auth_model->authorize())
{
redirect('login');
}
}
我在我的视图中有这个代码
$('#swfupload-control').swfupload({
upload_url: "<?=base_url()?>index.php/upload_center/upload",
file_post_name: 'fileupload',
file_size_limit : "200000000",
file_types : "*.zip;*.rar;*.pdf;*.doc;*.docx;*.mp3;*.avi;*.wmv;*.docx;*.jpg;*.jpeg;*.JPG;*.JPEG;*.png;*.gif;*.bitmap;",
file_types_description : "zip files ",
post_params: {"PHPSESSID": "<?=$this->session->userdata('session_id');?>"} ,
file_upload_limit : 1,
flash_url : "<?=base_url()?>js/jquery-swfupload/js/swfupload/swfupload.swf",
button_image_url : '<?=base_url()?>js/jquery-swfupload/js/swfupload/wdp_buttons_upload_114x29.png',
button_width : 114,
button_height : 29,
button_placeholder : $('#button')[0],
debug: false
我希望用户在登录后上传文件,因此我有一个方法需要用户登录才能继续上传文件。虽然我在我的视图中使用了flash uploader,但我认为它没有传递会话值,而且PHP认为用户没有登录并且将其重定向到登录页面。我发帖phpsessionid
但仍然没有。
答案 0 :(得分:7)
您的会话Cookie到期时间设置为什么? CodeIgniter中存在一个已知错误,如果您停留在使AJAX请求超过cookie过期的页面上,它将重置数据库中的会话ID,但无法在浏览器cookie中设置它,因为它是异步的请求。这导致在下一个非异步GET请求上断开连接,导致会话库调用sess_destroy()。如果这听起来像你的情况,请告诉我。否则,请提供更多详细信息。
编辑:我或许也应该在这里包含针对此错误的修复程序。在/ application / libraries中创建一个名为“MY_Session.php”的文件(如果它尚不存在)。在那里你可以粘贴这个:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
* Session Class Extension
*/
class MY_Session extends CI_Session {
/*
* Do not update an existing session on ajax calls
*
* @access public
* @return void
*/
function sess_update() {
if ( !isAjax() ){
parent::sess_update();
}
}
}
?>
那个isAjax()函数是我在/application/helpers/isajax_helper.php中的一个帮助器,如下所示:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* is_ajax_call
*
* Determines if the current page request is done through an AJAX call
*
* @access public
* @param void
* @return boolean
*/
if ( ! function_exists('isAjax')) {
function isAjax() {
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
}
}
?>
我的配置文件中引用了这样的内容:
$autoload['helper'] = array('otherhelper1', 'isajax', 'otherhelper2');
答案 1 :(得分:1)
默认情况下,CI会在定义的时间间隔内创建新的sessionid。查看配置以查看默认值(我相信它是5分钟)。因此$this->session->userdata('session_id')
将始终包含不同的ID,但CI仍然能够知道您是谁。
我出于同样的原因遇到了问题。我知道为什么CI人员创建了这个会话更新,但我觉得它让事情变得更复杂。只需为会话刷新输入更高的值,即可在配置中覆盖此行为。
在我的一个应用中,它看起来像这样:
$config['sess_expiration'] = 7200;
//$config['sess_time_to_update'] = 300;
$config['sess_time_to_update'] = $config['sess_expiration'];
这样,我就可以像没有框架一样使用会话。
答案 2 :(得分:1)
不可能。 Session类不使用本机PHP会话。
我推荐你的最佳做法
contoller contain uploadpage {
function index(){
$dataview['session_id'] = $this->secureUpload();
$this->load->view('upload',$dataview);
}
function secureUpload(){
$user_id = $this->session->userdata('cuser_id');
$md5pass = $this->basemodel->_getEncrypPassFromDb($user_id);
$time =time();
$session = md5($user_id.$time.$md5pass)."x".$user_id."x".$time;
return $session;
}
}
上传页面
('#swfupload-control').swfupload({
post_params: {"PHPSESSID": "<?=session_id?>"} ,
这样解密你的安全代码
function upload_function(){
list($session2, $user_id, $time) = explode("x", $session);
$this->load->library('upload', $config);
$md5pass = $this->basemodel->_getMD5pass($user_id);
$session_server = md5($user_id.$time.$md5pass)."x".$user_id."x".$time;
if($session_server == $session){
upload file by flash upload
}
}
答案 3 :(得分:1)
我刚遇到这个问题,ajax调用破坏我登录的用户会话。根据斯特金先生的建议,这是@treeface解决方案和CI 2.1.2。我想输入和加载库没有在CI_Session中自动加载,所以我必须得到CI对象的实例才能使它工作。
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
* Session Class Extension
*/
class MY_Session extends CI_Session {
protected $_CI;
/*
* Do not update an existing session on ajax calls
*
* @access public
* @return void
*/
function sess_update() {
$this->_CI =& get_instance();
if ( !$this->_CI->input->is_ajax_request() ){
parent::sess_update();
}
}
}
答案 4 :(得分:0)
我想你应该看到这个
http://ellislab.com/forums/viewthread/138823/
它解释了摆脱问题