2016-03-30 5 views
0

Недавно я развернул веб-сайт, где храню файлы cookie в браузере с именем продукта в качестве значения cookie. Но некоторые продукты имеют управляющие символы от их имени. В результате, когда эти имена продуктов сохраняются в файле cookie, исключение IllegalArgumentException, вызванное символом Control, генерируется в cookie-файле.Обработка java.lang.IllegalArgumentException: вызвано символом управления значением cookie

java.lang.IllegalArgumentException: Control character in cookie value or attribute. 
     at org.apache.tomcat.util.http.CookieSupport.isHttpSeparator(CookieSupport.java:169) 
     at org.apache.tomcat.util.http.Cookies.getTokenEndPosition(Cookies.java:493) 
     at org.apache.tomcat.util.http.Cookies.doProcessCookieHeaderOriginal(Cookies.java:283) 
     at org.apache.tomcat.util.http.Cookies.processCookieHeader(Cookies.java:233) 
     at org.apache.tomcat.util.http.Cookies.processCookies(Cookies.java:141) 
     at org.apache.tomcat.util.http.Cookies.getCookieCount(Cookies.java:107) 
     at org.apache.catalina.connector.CoyoteAdapter.parseSessionCookiesId(CoyoteAdapter.java:1163) 
     at org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:914) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:532) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 
     at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566) 
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
     at java.lang.Thread.run(Thread.java:745) 

Некоторая идея в моем сознании, что я должен кодировать имя перед магазином в куки.

Но проблема в том, что многие пользователи, уже столкнувшиеся с проблемой, не могут просматривать сайт.

Есть ли способ обработать исключение без изменения значения cookie или есть способ удалить старые файлы cookie, которые были проблематичными или каким-либо другим.

ответ

0

Что касается будущих печенья, ваше решения просто URL-encode или Base64-encode значения перед установкой его в печенье, а затем URL-decode или Base64-decode его на чтении.

Относительно существующих пользователей, которые «отравили» куки-файлы, это в значительной степени зависит от вашего дизайна приложения и фреймворка.

Подход может состоять в том, чтобы настроить Tomcat для разрешения таких значений (которые могут иметь побочные эффекты в зависимости от того, как вы используете фактические значения). Вас могут заинтересовать ALLOW_HTTP_SEPARATORS_IN_V0 или ServerCookie.STRICT_NAMING.

См. Спецификации здесь http://tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html#Specification для всех твикабельных свойств.

В зависимости от того, какие символы отправляются («контрольные символы» немного расплывчаты :)), это может сделать трюк.

Другим решением будет решение проблемы на стороне клиента: просто удалите проблемные файлы cookie с помощью Javascript. С Angular вы можете просто $ cookies.remove ('poisonedCookie'); Если вы не знаете, какие файлы cookie проблематичны, я предлагаю выполнить цикл на каждом из них и при обнаружении контрольного символа удалить его.

Возможно, существуют другие серверные решения (например, перехват IllegalArgumentException, проверьте содержимое сообщения, и если это связано с cookie, удалите файл cookie), но для этого потребуется более подробная информация о вашем приложении + 2 других вышеуказанных предложения, вероятно, сделают трюк в более простой форме.

Другим решением (не большим ..) является переход на версию Tomcat, которая принимает такие символы (любой Tomcat до 7). Но изменение свойств tomcat, безусловно, является лучшим способом достижения этого, далеким

+0

Как запустить javascript, пока сайт находится в режиме исключения? –

+0

Ah lol Я должен признать, что исправление на стороне клиента не имеет смысла! Ясно, что я буду копаться в свойствах Tomcat (особенно проверьте, что я выделил 2), это чистое решение. – niilzon