2011-12-25 50 views
2

我搞乱uploadify和cakephp(2.x)atm,但我不能让它工作。它在一小时前运作,现在它被神奇地摧毁。cakephp 2.x/uploadify:更改会话ID强制注销

我的cakephp应用程序具有一个简单的认证后端。用户可以使用uploadify上传图像,当uploadify将图像发送给我的控制器时,我只需将sessionid作为参数。

不幸的是我收到一个HTTP-ERROR(HTTP/1.1 304 Not Modified)。从认证中排除控制器的方法($ this-> allow(...))确实有帮助。因此,我认为在认证/会话方面失败了。

我采取的下一步是我检查SID是否传输和它。

这就是为什么我认为我将问题范围缩小到会话ID设置的位置。这种情况发生在控制器的beforeFilter中:

if(isset($ this-> params ['session_id'])){$ this-> Session-> id($ this-> params ['session_id' ]); }

当我添加一段代码有事,我无法解释/理解:

我试着通过uploadify在backened上传的图像,并将其与HTTP错误返回。点击F5/Refresh会导致登录表单重定向,尽管我实际登录了!我也得到一个新的SID。

我99%确定session_id参数被传送到控制器,$ this-> Session-> id()应该设置正确的SID。

那么为什么我会注销?

当我手动调用URL到我的控制器(http:// localhost/myapp/backend/upload/12345 * 12345是SID!)时,我不会注销。只有在uploadify做到这一点。

我也尝试设置蛋糕安全级别低,但它不会帮助。当我将sessionData参数提交给uploadify js脚本时,也会发生这种情况。

当我使用我的控制器的方法,该行的代码:

$this->Session->id(1234); 
echo $this->Session->id(); 

方法回波1234,但在我的后台的页面视图仍然指出原来的会话值。这到底是怎么回事?

有没有人可能知道正在发生的事情,或者至少知道为什么会话/身份验证的行为方式如此?

在此先感谢您的帮助!

问候


固定它。

我的控制器的beforeFilter()函数看上去像是:

parent::beforeFilter(); 
if (isset($this->params['session_id'])) { $this->Session->id($this->params['session_id']); } 

但会话ID必须设置之前调用父:: beforeFilter()函数。

if (isset($this->params['session_id'])) { $this->Session->id($this->params['session_id']); } 
parent::beforeFilter(); 

该死-.-浪费了这么多时间..

回答

0

我有同样的问题,我解决的方式是通过创建一个组件:SessionRescueComponent,并宣布在AppController FIRST:

public $components = array('SessionRescue', 'Auth', 'Security' ...); 

在新组件:

class SessionRescueComponent extends Component { 

    /** 
    * Restore session from POST fields if possible. 
    * 
    * This is required because flash plugin uses a different 
    * session (id and user agent) from the application one. 
    * 
    * @param Object &$controller pointer to calling controller 
    */ 

     public function initialize(& $controller) { 

      if ((isset($_SERVER['HTTP_USER_AGENT']) and ((strtolower($_SERVER['HTTP_USER_AGENT']) == 'shockwave flash') or (strpos(strtolower($_SERVER['HTTP_USER_AGENT']) , 'adobe flash player') !== false))) and 
       isset($controller->data['Model']['session_id']) and ($controller->action == 'imageupload' || $controller->action == 'upload' || $controller->action == 'flashupload')) { 

       session_id($controller->data['Model']['session_id']); 
       session_start(); 

      } 
     } 
} 

如果您要设置您的会话蛋糕的方式

你的类中:

public $components = array('Session'); 

那么你的IF块中:

$this->Session->id($controller->data['Model']['session_id']); 
$this->Session->start(); 

之前任何与做这基本上将调用该应用程序,并应该设置您的会话ID之前任何可能会丢失。

祝你好运!