IE не может загружать файлы через SSL, обслуживаемый WebSphere

IE 7 и 8 выдают ошибку, когда пользователи пытаются загрузить CSV-файл через https.

Internet Explorer не может загрузить файл downloadPage.jsf. Internet Explorer не смог открыть этот интернет-сайт. Запрашиваемый сайт либо недоступен, либо не найден. Пожалуйста, попробуйте еще раз

Я читал о проблемах IE в отношении кэширования, поэтому я изменил ответ, чтобы разрешить публичное кэширование. Смотрите эту проблему: IE не может скачать foo.jsf. IE не смог открыть этот интернет-сайт. Запрашиваемый сайт либо недоступен, либо не найден

response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "public");

Но я все еще получаю эту ошибку.

Есть идеи, что еще может быть причиной проблемы? Вот полный фрагмент:

HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
response.setContentType("text/plain");
response.setHeader("Content-Disposition", "attachment; filename=\"" + browserFilename + "\"");
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "public");
response.getOutputStream().write(contentBytes);
context.responseComplete();

6 ответов

Решение

Похоже, что WebSphere автоматически добавляет Cache-Control:no-cache=set-cookie заголовок ответа, когда куки включены в ответ. IE8 и старше не нравится это при загрузке через SSL.

Есть два возможных исправления в соответствии с этой веткой форума IBM Developerworks:

  1. Добавьте пользовательский заголовок ответа CookiesConfigureNoCache:false для транспортного HTTP-канала в WebSphere (по умолчанию это так).

    response.setHeader("CookiesConfigureNoCache", "false");             
    
  2. Явно установите Cache-Control заголовок после добавления файлов cookie переопределяет установленный WebSphere.

    response.addCookie(...);
    response.addCookie(...);
    ...
    response.setHeader("Cache-Control", ...);
    

У меня была такая же проблема с IE8. Я сделал небольшие изменения в своем коде.

Response.ClearHeaders (); // нужен, иначе "no-cache: set-cookie" был там, должен был от него избавиться

Response.addHeader("Cache-Control", "private");

Точно такая же проблема, когда сервер приложений был настроен на использование SSL. Уловка для меня, чтобы заставить это работать после того, как https был включен:

   string attachment = "attachment; filename=" + rptName + ".xls" + "";    

    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ClearHeaders();
    HttpContext.Current.Response.AddHeader("content-disposition", attachment);
    HttpContext.Current.Response.AddHeader("Cache-Control", "private, max-age=1");

    HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";

    HttpContext.Current.Response.Charset = "";
    HttpContext.Current.Response.Buffer = true;
    HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddMinutes(1));

Я думаю, что вы на правильном пути с кэшированием:

Эта статья базы знаний может помочь вам, Internet Explorer не может открыть документы Office с веб-сайта SSL

Упоминается в этом вопросе переполнения стека: не удается открыть файл xls в IE

У меня такая же проблема. После установки "Content-Disposition" и "Content-Type" добавьте этот код.

Java-код

// IE requires these three lines, exactly like this
response.setHeader("CookiesConfigureNoCache", "false");             
response.setHeader("Pragma","private,no-cache");     
response.setHeader("Cache-control","private,no-store,no-cache,max-age=0,must-revalidate");

Код PHP

// IE requires these three lines, exactly like this
header("CookiesConfigureNoCache: false");
header("Pragma: private,no-cache");
header("Cache-control: private,no-store,no-cache,max-age=0,must-revalidate");

Вот что я сделал в своем PHP-коде:

header( "HTTP/1.0 200 OK" );
header( "Content-Disposition: inline; filename=$path" );
header( "Content-Type: attachment; application/pdf" );
header( "Content-Length: $info[7]" );
header( "Cache-Control: no-store, no-cache" );          // IE 8 requires these two lines, exactly like this
header( "Pragma: private" );                            // IE 8 requires these two lines, exactly like this
readfile( $tmpfile );
Другие вопросы по тегам