Session cakephp 2.x/uploadify:更改会话id将强制注销
我正在处理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脚本时,也会发生这种情况 当我在控制器的方法中使用该代码行时: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(…)会有所帮助。因此,我假设身份验证/会话失败 我采取的下一步是检
$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
祝你好运