Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session cakephp 2.x/uploadify:更改会话id将强制注销_Session_Cakephp_Login_Authentication - Fatal编程技术网

Session cakephp 2.x/uploadify:更改会话id将强制注销

Session cakephp 2.x/uploadify:更改会话id将强制注销,session,cakephp,login,authentication,Session,Cakephp,Login,Authentication,我正在处理uploadify和cakephp(2.x)atm,但我无法让它工作。它一小时前就开始工作了,现在它被神奇地摧毁了 我的cakephp应用程序具有一个带有简单身份验证的后端。用户可以使用uploadify上传图像,当uploadify将图像发送到我的控制器时,我只需附加sessionid作为参数 不幸的是,我收到一个HTTP错误(HTTP/1.1 304未修改)。将控制器的方法从身份验证中排除($this->allow(…)会有所帮助。因此,我假设身份验证/会话失败 我采取的下一步是检

我正在处理uploadify和cakephp(2.x)atm,但我无法让它工作。它一小时前就开始工作了,现在它被神奇地摧毁了

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

不幸的是,我收到一个HTTP错误(HTTP/1.1 304未修改)。将控制器的方法从身份验证中排除($this->allow(…)会有所帮助。因此,我假设身份验证/会话失败

我采取的下一步是检查SID是否被传输,它是否被传输

这就是为什么我认为我将问题缩小到会话id设置的位置。这在控制器的beforeFilter中以如下方式发生:

if(isset($this->params['session\u id']){$this->session->id($this->params['session\u id']);}

当我添加这段代码时,发生了一些我无法解释/理解的事情:

我试图通过backed中的uploadify上传一个图像,它返回一个HTTP错误。点击F5/刷新会导致重定向到登录表单,尽管我实际上已登录!我还得到了一个新的SID

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

那我为什么要注销

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

我还尝试将蛋糕安全级别设置为较低,但没有帮助。当我使用scriptData参数将会话ID提交到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']); }
但是在调用parent::beforeFilter()函数之前,必须设置会话id

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

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

我也遇到了同样的问题,我解决问题的方法是创建一个组件:
SessionRescueComponent
,并首先在
AppController
中声明:

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


祝你好运

我也遇到了同样的问题,我解决问题的方法是创建一个组件:
SessionRescueComponent
,并首先在
AppController
中声明:

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

祝你好运