会议意外丢失?

时间:2009-09-23 07:33:39

标签: php session internet-explorer header

我对导出报告的烦恼问题感到茫然。基本上,按下按钮并使用以下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!');
    }
});

导出控制器的“构建”操作会将报告构建到服务器上的临时文件中。如果成功,则调用“输出”操作以将该文件输出到隐藏的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);
}

我遇到的问题是:虽然这个工作正常,但在第一次成功下载文件后,会话似乎被破坏了。也就是说,当用户导航到另一个页面时,他们似乎生成了新的会话ID。这还要求用户必须“重新登录”,如果基本身份验证正在使用,他们将采取下一步行动。

这个问题似乎很间歇,似乎有时会发生而不是在其他时间发生。

有没有人有任何想法?我是否应该添加更多标题或其他内容以防止用户会话被销毁?

2 个答案:

答案 0 :(得分:1)

如果iframe的顶级域不相等,则Ie将恢复为p3p协议并删除会话。添加标题将解决此问题。

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

答案 1 :(得分:0)

可能是您遗失的某个session_namesession_start

或者,更有可能的是,您的用户已禁用Cookie。这样会话仅对一个站点请求有效