<< Ошибка в ehcache "singleton CacheManager" | На главную | Борьба с кракозябрами в запросах >>

408 ошибка, tomcat и Microsoft Internet Explorer 6

Почему-то в когда-то нормально рабочем приложении резко начала появляться ошибка:
HTTP Status 408 - The time allowed for the login process has been exceeded. If you wish to continue you must either click back twice and re-click the link you requested or close and re-open your browser

Причём ошибка была обнаружена только у части клиентов и воспроизводилась у них железобетонно даже после перезагрузки браузера/компьютера. Более того, после отката на стабильную версию приложения клиенты всё равно не могли войти в систему с тем же сообщением.

Исправления вносились только в приложение, настройки сервера не были затронуты, поэтому первое и последнее на что было обращено внимание - это свежевведённые cookies для отслеживания пользователей. Заполнялись они генератором случайной строки по символам с кодами с 33 по 127 со сроком жизни в 1 год.

Как оказалось, некоторые из этих символов в cookies приводят к ошибке Internet Explorer 6, который, по всей видимости, портил их значение и после попадания этого cookie в томкэт в форму j_security_check тот входит в клин, не находит сессию, хотя считает что она есть и считает что сессия безнадёжно утеряна, а значит устарела. "Повезло" только части клиентов, которым генератор выдал ненужные символы.

Зависших клиентов починили просьбой полностью "удалить Cookies" в Internet Explorer 6 - только после этого они смогли нормально заходить на сайт - испорченные куки лежали в браузере (с датой экспирации в 1 год) и продолжали делать своё гадкое дело - запрещали Internet Explorer 6 отдавать cookie на наш сайт.

Следующая встреча с ошибкой HTTP Status 408 - The time allowed for the login process has been exceeded. Произошла через 2 месяца и потратила гораздо больше времени для решения.

Симптомы ошибки были другими - приложение абсолютно новое, новый сервер, старая версия tomcat 5.5.9, авторизация не проходила ни по протоколу ajp ни по протоколу http.
Проделанные изыскания заставили сначала изменить правила безопасности в web.xml, проверить настройки iptables, проверить настройки Apache 2.2 и модуля mod_proxy.

Далее попробовали сделать наиболее популярное решение - исправить настройки session-timeout в web.xml на большее значение:
    <session-config>
        <session-timeout>120</session-timeout>
    </session-config>

не помогло. дальше была настроена авторизация через SingleSignOn, прописали в server.xml:
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

Ещё одно из заклинаний по этой теме было исправление пути куки JSESSION на весь домен, чтобы сессия не терялась ни в коем случае:
    <Connector port="80" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true"
emptySessionPath="true"
 />

не помогло.

Переход на Tomcat 6.0.20 не помго так же, но включение отладочного режима в Tomcat позволил увидеть новое сообщение в tomcat.log:
User took so long to log on the session expired

Сообщение особенно приятное, с учётом того, что юзер нажал авторизацию через 5-10 секунд после начала сессии.

Приложение всё ещё не давало авторизации в Internet Explorer 6, но стабильно работало в Mozilla Firefox. Прочистка cookies не помогает, приложение в явном виде их не использует, но появился новый симптом - приложение работало в IE 6 но в другом виртуальном хосте.

Разница получалась только в названиях хостов: www. и remote_manager. в результате, как всегда, оказалось что ошибка простейшая - мы прописали поддомен с символом подчёркивания и браузеры с ним нормально работали и нормально отображали все страницы (хотя это и не по правилам именования доменов), но только Internet Explorer 6 портил cookie и не отдавал их обратно на сервер. Наиболее показательным является тот факт, что DNS у нас тоже от Microsoft и он спокойно разрешил завести такой домен.

Вот мой совет для ошибки HTTP Status 408: аккуратнее работайте с cookies, старайтесь заполнять их символами латинницы, и никогда не используйте в имени домена символ подчёркивания "_".
Ярлыки : , ,



Комментировать Отправить TrackBack
На главную