JBoss 5 усекает завершающий = строки cookie base64

После обновления с JBoss 4 до JBoss 5 я заметил наиболее раздражающую регрессию. Он усекает завершающий знак равенства ('=') значения cookie base64.

Мне потребовалось так много времени, чтобы понять, что проблема была не в моем коде, а в JBoss', я погуглил его и обнаружил, что это известная проблема.

Предложенный обходной путь заключается в том, чтобы вычислить длину строки и дополнить ее последующими знаками равенства (до длины, кратной 4).

Поскольку наше приложение может работать на нескольких серверах приложений (например, WebLogic, WebSpehere), я очень неохотно добавляю этот фрагмент кода, специфичный для этой версии JBoss.

Кто-нибудь сталкивался с этим? Можете ли вы предложить более разумный обходной путь?

edit: благодаря @skaffman я понял мою проблему, я не должен был использовать base64 для строки cookie в первую очередь. Существует вариант на базе 64, называемый base64 url, который должен использоваться для таких строк (cookie, urls...). Например, библиотека кодеков Apache поддерживает этот вариант в своей базовой реализации.

3 ответа

Решение

Есть ли у вас контроль над тем, как ваши куки создаются и кодируются / декодируются? Если это так, то вы можете переключиться на альтернативный механизм кодирования, который не использует символы, которые могут конфликтовать со спецификацией cookie. Например, кодек Apache Commons включает класс Hex, который может кодировать и декодировать двоичные данные в шестнадцатеричную строку и из нее. Это будет больше, чем эквивалентные данные в base64, но это может не иметь значения.

В качестве альтернативы, вы можете немного поиграть с Cookie API. Javadoc для Cookie.setValue() говорит:

В файлах cookie версии 0 значения не должны содержать пробелов, скобок, скобок, знаков равенства, запятых, двойных кавычек, косых черт, вопросительных знаков, знаков, двоеточий и точек с запятой. Пустые значения могут не работать одинаково во всех браузерах.

Технически, кодировка base64 несовместима с файлами cookie версии 0, что может быть по умолчанию. Вы можете попробовать позвонить setVersion(1) на куки, и посмотрите, если это имеет значение, хотя тогда вы рискуете проблемы совместимости браузера.

Если я правильно понимаю отчет об ошибке, правильная реализация кодировщика всегда выдаст строку, кратную 4, поэтому, если вы добавите исправление ошибки, она не сработает на других серверах приложений, кроме JBoss. Таким образом, ваш код будет работать на всех серверах. Кстати, возможно, вы могли бы реализовать его как фильтр сервлетов, который будет минимально навязчивым для вашего приложения.

Для jboss 5 установите следующее системное свойство:

org.apache.catalina.STRICT_SERVLET_COMPLIANCE = ложь

--bala

Другие вопросы по тегам