В любом RIA приложении необходима авторизация. Благо сделать ее не составляет труда. Чаще всего авторизация проводится на серверной части и ее результаты записываются в параметры сессии. Это позволяет запрашивать данные авторизации пользователя только один раз, за весь сеанс его работы с приложением.
В связке Flex и PHP такая схема работает без проблем. Все запросы к серверной части можно защитить проверкой данных авторизации в сессии PHP. Но если вы попробуете проверить авторизацию в обработчике POST запроса загрузки файла из FileReference, у вас ничего не выйдет. Сессия в обработчике этого запроса будет пустая.
Сессия PHP связывается с сессией браузера посредством идентификатора, хранящегося в cookie браузера. Проблема же заключается в том, что при запросе через FileReference cookie не передаются. В результате PHP открывает новую сессию.
Для того, чтобы PHP использовал уже имеющуюся сессию, необходимо к адресу запроса добавить параметр идентификатора текущей сессии. Например:
public function browse():void
{
fileReference = new FileReference();
fileReference.addEventListener(Event.SELECT, onDocumentSelected);
fileReference.browse();
}
private function onDocumentSelected(event:Event):void
{
getSession();
}
private function sessionRecieved(sessionId:String):void
{
var url:String = "http://example.com?PHPSESSID=" + sessionId;
var urlRequest:URLRequest = new URLRequest(url);
fileReference.upload(urlRequest);
}
В примере, в обработчике выбора документа вызывается метод getSession(), запрашивающий у PHP части идентификатор сессии. Когда этот идентификатор получен, вызывается метод sessionRecieved, помещающий идентификаторы сессии в строку запроса и инициирующий загрузку файла. Идентификатор сессии помещается в параметр PHPSESSID.
Так же идентификатор PHP cессии можно запросить через JavaScript. Но мне этот вариант не нравится.
public function execute():void
{
fileReference = new FileReference();
fileReference.addEventListener(Event.SELECT, onDocumentSelected);
fileReference.addEventListener(Event.OPEN, openHandler);
fileReference.addEventListener(IOErrorEvent.IO_ERROR, ioErrorUpload);
fileReference.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityError);
fileReference.addEventListener(Event.CANCEL, cancelUpload);
fileReference.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, uploadCopmpleteDataHandler);
fileReference.browse([FileUpload.DOCUMENTS_FILTER, FileUpload.IMAGES_FILTER]);
}
private function uploadCopmpleteDataHandler( event:DataEvent ) :void {
logger.debug(«responseHandler::event.data = » +(event.data as String));
var data:Object = JSON.decode(event.data as String);
if (data.result != «ok»){
model.sharedFiles.state = SharedFiles.UNPENDING_STATE;
AlertDefault.show(ResourceManager.getInstance().getString(‘ui_res’, ‘file_uppload_fail’), ResourceManager.getInstance().getString(‘ui_res’, ‘ufc_alrt_00′));
}else{
new UploadFileCheckFileConvCom().execute();
}
}
private function onDocumentSelected(event:Event):void
{
if((event.currentTarget as FileReference).size > 15728640){
//check that file size < 15728640
AlertDefault.show(ResourceManager.getInstance().getString(‘ui_res’, ‘upload_file_size_limit_message’));
}
else{
if(model.guiState.isAllowedLoadDocuments || model.conference.iam.privileges.hasBroadcast){
model.sharedFiles.state = SharedFiles.PENDING_STATE;
new GetSession(sessionRecieved, getSessionError).call();
}else{
AlertDefault.show(ResourceManager.getInstance().getString(‘ui_res’, ‘deny_upload_document_message’));
}
}
}
private function getSessionError():void{
model.sharedFiles.state = SharedFiles.UNPENDING_STATE;
}
private function sessionRecieved(sessionId:String):void
{
var url:String = ConferenceManagerModel.httpBaseUrl + «?act=upload»;
url += («&conf_url=» + model.conference.urlConf);
url += (!(ConferenceManagerModel.isOwner || ConferenceManagerModel.isRegistered) ? «&author_reg=0″ : «&author_reg=1″);
url += «&author=» + (!(ConferenceManagerModel.isOwner || ConferenceManagerModel.isRegistered) ? model.conference.iam.name : ConferenceManagerModel.uid) ;
url += «&PHPSESSID=» + sessionId;
logger.info(«Attempt of upploading file to url: » + url);
var urlRequest:URLRequest = new URLRequest(url);
fileReference.upload(urlRequest);
}