Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Ошибка javax.crypto.BadPaddingException


Автор: TopaZ 26.2.2009, 21:08
Здравствуйте. 
При попытке запуска JSF-страницы, она (страница) сначала открывается нормально, но при выполнениии submit на любом из элементов на странице, выскакивает следующее исключение:
Код

javax.crypto.BadPaddingException: Given final block not properly padded

Caused by:
javax.crypto.BadPaddingException - Given final block not properly padded
+- Stack Trace
javax.faces.FacesException: javax.crypto.BadPaddingException: Given final block not properly padded
    at org.apache.myfaces.shared_impl.util.StateUtils.symmetric(StateUtils.java:373)
    at org.apache.myfaces.shared_impl.util.StateUtils.symmetric(StateUtils.java:411)
    at org.apache.myfaces.shared_impl.util.StateUtils.decrypt(StateUtils.java:291)
    at org.apache.myfaces.shared_impl.util.StateUtils.reconstruct(StateUtils.java:240)
    at org.apache.myfaces.renderkit.html.HtmlResponseStateManager.getSavedState(HtmlResponseStateManager.java:184)
    at org.apache.myfaces.renderkit.html.HtmlResponseStateManager.getTreeStructureToRestore(HtmlResponseStateManager.java:148)
    at org.ajax4jsf.application.AjaxStateManager.restoreLogicalViewId(AjaxStateManager.java:328)
    at org.ajax4jsf.application.AjaxStateManager.restoreStateFromSession(AjaxStateManager.java:245)
    at org.ajax4jsf.application.AjaxStateManager.restoreView(AjaxStateManager.java:225)
    at org.apache.myfaces.application.jsp.JspViewHandlerImpl.restoreView(JspViewHandlerImpl.java:505)
    at org.ajax4jsf.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:116)
    at org.ajax4jsf.application.AjaxViewHandler.restoreView(AjaxViewHandler.java:131)
    at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:85)
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:103)
    at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:76)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:148)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:147)
    at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:276)
    at org.ajax4jsf.Filter.doFilter(Filter.java:175)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:595)
Caused by: javax.crypto.BadPaddingException: Given final block not properly padded
    at com.sun.crypto.provider.SunJCE_h.b(DashoA12275)
    at com.sun.crypto.provider.SunJCE_h.b(DashoA12275)
    at com.sun.crypto.provider.DESCipher.engineDoFinal(DashoA12275)
    at javax.crypto.Cipher.doFinal(DashoA12275)
    at org.apache.myfaces.shared_impl.util.StateUtils.symmetric(StateUtils.java:369)
    ... 32 more


при этом я не использую никакого криптографического шифрования или чего нибудь подобного. 
И еще один момент: это исключение возникает постоянно при открытии страницы во встроенном в Eclipse браузере, а в других браузерах, запущенных параллельно, все работает нормально, хотя изредка бывает, что и в них выскакивает такое же исключение. Кто знает, что это может быть?

Автор: lemonade 27.2.2009, 04:07
Не знаю не сталкивалась + нет самой страницы и прочая...
Посмотри ссылки (проблемы в майфейсах похожие):
https://issues.apache.org/jira/browse/MYFACES-1786
https://issues.apache.org/jira/browse/MYFACES-1838

И тут есть как забанить всю лабуду с инкрипшном/декрипшном в принципе тоже что и в issue, но, вроде в issue комент урезанный:
http://www.mail-archive.com/dev@myfaces.apache.org/msg36977.html

Автор: TopaZ 27.2.2009, 19:59
две первые ссылки не работают, а по третьей получил следующее:
Цитата

(1) in web.xml, define init-parameter "org.apache.myfaces.SECRET" to be some 
reasonably long string. The server will then use the same encryption secret 
after restart (instead of generating a key itself), and so will be able to 
decrypt "old" sessions. 

(2) in web.xml, define init-parameter "org.apache.myfaces.USE_ENCRYPTION" to 
be "false", in order to disable client-side state encryption. Of course this 
potentially opens a security hole in the app. 

(3) use server-side state saving (only client-side state is encrypted)


А кто расскажет, что означает третий пункт?

Автор: powerOn 27.2.2009, 20:45
Цитата(TopaZ @  27.2.2009,  19:59 Найти цитируемый пост)
use server-side state saving (only client-side state is encrypted)


"Используйте метод сохранения состояния на стороне сервера. (Только сохранения состояния на стороне клиента шифруется)"

Для того чтобы использовать server-side state saving в JSF, нужно в web.xml добавить:
Код

<context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>


Автор: TopaZ 27.2.2009, 21:10
Я прошу прощения, наверное я не знаю элементарных вещей, но на что влияет данный параметр (javax.faces.STATE_SAVING_METHOD)?

Что при этом изменится в работе приложения и для чего он нужен?

Автор: powerOn 27.2.2009, 21:32
STATE_SAVING_METHOD - это способ сохранения информации о View. Т.е. некоторый набор данных который должен быть сохранен между запросами, необходимый при восстановлении состояния UI дерева в JSF.
Если использовать  сохранение состояния на клиенте, то эта информация гоняется между клиентом и сервером в запросах (через hidden поля). Плюс тут в том что у сервера не занимается лишняя память, а минус в увеличении трафика.  В другом случае (серверное хранение состояния)  плюсы и минусы обратные.

Автор: TopaZ 27.2.2009, 22:31
Спасибо за объяснение.
STATE_SAVING_METHOD не помогает, оказалось, что у меня по умолчаниию установлен именно server-side state saving

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)