Сегодня вылез забавный баг.
Мы используем в одном из наших проектов 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"/>
Вот и все.