Русский English Тэги View Sergey Zolotaryov's profile on LinkedIn Вход
IE file could not be written to the cache
Постоянная ссылка 06-06-2008 anydoby java

Сегодня вылез забавный баг.

Мы используем в одном из наших проектов SSL и пользователи загружают регистрационную форму в PDF формате, потом что-то с ней делают. Проблема в том, что в Internet Explorer при клике на линк с формой выкидывается забавная ошибка от браузера:


File could not be written to the cache

Поискав в интернете, обнаружили, что это известная проблема IE и микрософт предлагает обойти ее при помощи изменения ключа в реестре :) забавно предлагать такое клиентам на своем сайте :) Начал я копать дальше и обнаружил, что в респонсе присутствуют заголовки: Cache-Control: no-cache и Pragma: no-cache, которых я, собственно, нигде не добавлял. А именно из-за них вся проблема - типа некэшируемый контент IE не может загрузить, да еще и через защищенное соединение.

Порыв исходники Tomcat, обнаружил забавные строчки:


        // Make sure that constrained resources are not cached by web proxies
        // or browsers as caching can provide a security hole
        if (disableProxyCaching && 
            // FIXME: Disabled for Mozilla FORM support over SSL 
            // (improper caching issue)
            //!request.isSecure() &&
            !"POST".equalsIgnoreCase(request.getMethod())) {
            if (securePagesWithPragma) {
                // FIXME: These cause problems with downloading office docs
                // from IE under SSL and may not be needed for newer Mozilla
                // clients.
                response.setHeader("Pragma", "No-cache");
                response.setHeader("Cache-Control", "no-cache");
            } else {
                response.setHeader("Cache-Control", "private");
            }
            response.setHeader("Expires", DATE_ONE);
        }

умиляет обилие FIXME в таком ответственном месте. В общем, этот хитрюга добавляет сам хедеры, никого не спрашивая. Как это починить? Класс, в котором этот код, называется org.apache.catalina.authenticator.AuthenticatorBase? конкретный класс, использующий эту функциональность, зависит от типа авторизации, который у вас используется. Так как мы не использовали JEE авторизацию, то наш класс называется org.apache.catalina.authenticator.NonLoginAuthenticator. Для устранения проблем нужно лишь добавить настройку в context.xml вашего war файла:


<Valve className="org.apache.catalina.authenticator.NonLoginAuthenticator" securePagesWithPragma="false"/>

Вот и все.

Добавить комментарий

Предыдущая статья Как узнать, кто наделал OOM Следующая статья Луч света в царстве JSF