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();

Ответы

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Была ли такая же проблема, когда сервер приложений настроен на использование 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));

Ответ 5

У меня была та же проблема. После установки "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");

Ответ 6

Вот что я сделал в своем 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 );