Сессия неожиданно потеряна?

Меня не устраивает неприятная проблема, связанная с экспортом отчета. Обычно нажимается кнопка, и на стороне сервера создается отчет с использованием следующего javascript: -

__callExportController(true, { op: 'build', type: exportType }, function(data) {
    var outputURL = './reportinc/export_controller.php?op=output&filename=';
    var reportFilename = data['filename'];
    var reportTitle = data['title'];

    if (reportFilename && reportTitle) {

        var resultURL = outputURL + reportFilename + '&title=' + reportTitle;

        /* Initiate the download dialog */
        if (!$('#exportFrame').length) {
            var hiddenIFrame = document.createElement('iframe');
            hiddenIFrame.setAttribute('id','exportFrame');
            document.body.appendChild(hiddenIFrame);
        }

        $('#exportFrame').attr('src', resultURL);
    } else {
        error('No filename or report title specified!');
    }
});

Операция «build» контроллера экспорта создает отчет во временный файл на сервере. Если это удается, вызывается операция вывода для вывода этого файла в скрытый iframe, чтобы получить запрос на загрузку для пользователя. Здесь используются только Internet Explorer 6/7.

Это обработчик вывода на сервере, который iframe будет запрашивать с успешно созданным именем файла: -

/* Output handler */
case 'output':{

    $filename = $_GET['filename'];

    header('Content-Description: File Transfer');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
    header("Content-Type: application/pdf");

    /**
     * NOTE: It appears this is required for some versions of adobe!
     * http://www.acrobatusers.com/forums/aucbb/viewtopic.php?id=15400
     */
    header("Cache-Control: private");
    header("Pragma: cache");
    header("Content-Disposition: attachment; filename=\"file.pdf\"");
    header('Content-Length: ' . filesize($filename));

    /* Flush the headers immediately for larger files */
    ob_clean();
    flush();
    readfile($filename);
    @unlink($filename);
}

Проблема, с которой я столкнулся, заключается в следующем: хотя однажды это работает нормально, сеанс кажется разрушенным после первой успешной загрузки файла. То есть, когда пользователь переходит на другую страницу, кажется, что создается новый идентификатор сеанса. Это также требует от пользователя повторного входа в систему, если используется базовая аутентификация, со следующим действием, которое он предпримет.

Проблема кажется очень неустойчивой, и это, кажется, случается время от времени, а не в другое время.

Есть у кого-нибудь идеи? Должен ли я добавить больше заголовков или что-то еще, чтобы предотвратить разрушение сеанса пользователя?


person Gavin Gilmour    schedule 23.09.2009    source источник


Ответы (2)


если домен верхнего уровня iframe не совпадает, Ie вернется к протоколу p3p и удалит сеанс. добавление заголовка решит эту проблему.

http://weblogs.asp.net/coltk/archive/2010/10/13/session-lost-in-iframe-p3p-issue.aspx.

person J-P Gommers    schedule 14.03.2011

может быть, вы где-то пропали session_name или session_start.

или, что более вероятно, у вас отключены файлы cookie. таким образом сеансы действительны только для одного запроса сайта

person knittl    schedule 23.09.2009
comment
Хммм, я почти уверен, что сеанс запускается везде, и это приложение на основе внутренней интрасети, поэтому файлы cookie должны быть определенно включены везде. Это особенно расстраивает, потому что, похоже, сейчас он работает нормально, очень с перебоями :( - person Gavin Gilmour; 23.09.2009
comment
возможно, ваш файл / tmp регулярно очищается, и поэтому ваши сеансы очищаются таким же образом - person knittl; 23.09.2009