Исключение сервлета JSF: нет состояния сохранения представления, когда сеанс приложения переходит между серверами - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть веб-приложение, работающее в среде CICS на серверах Liberty.Для управления рабочей нагрузкой сеанс приложения настроен на переключение между 3 различными серверами, что происходит случайным образом в течение данного сеанса.Реализуя это, я в настоящее время получаю следующую ошибку:

Error 500: javax.servlet.ServletException: /{page_name}.xhtml - No saved view 
state could be found for the view identifier: /{page_name}.xhtml

Ошибка происходит случайным образом, но кажется, что это происходит только тогда, когда сеанс приложения перешел на другой сервер.Я проверил это, выключив два сервера, и увидел, что после этого сеанс будет работать без проблем.Мое приложение имеет безопасность и требует учетные данные для входа в систему при запуске сеанса, и я полагаю, что это каким-то образом влияет на визуализацию страниц, когда оно переходит на серверы, как если бы учетные данные не переходили во время сеанса.Я провел некоторое исследование и попытался переключить метод state_saving с сервера на клиент, добавив следующий контекстный параметр в приложения web.xml:

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

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

РЕДАКТИРОВАТЬ: трассировка в стеке:

[2/12/19 15:25:53:672 CST] 00000056 com.ibm.ws.webcontainer.webapp                               
E SRVE0315E: An exception occurred: java.lang.Throwable: 
javax.servlet.ServletException: /pltdisable.xhtml - No saved view state 
could be found for the view identifier: /pltdisable.xhtml
at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:5006)
at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.handleRequest(DynamicVirtualHost.java:314)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:995)
at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.run(DynamicVirtualHost.java:279)
at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink$TaskWrapper.run(HttpDispatcherLink.java:1009)
at com.ibm.cics.wlp.impl.CICSHttpRunnable.run(CICSHttpRunnable.java:244)
at com.ibm.cics.wlp.impl.CICSTaskWrapper.runWork(CICSTaskWrapper.java:762)
at com.ibm.cics.wlp.impl.CICSTaskWrapper.run(CICSTaskWrapper.java:415)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1160)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at com.ibm.cics.wlp.threading.CICSThread.run(CICSThread.java:245)
at com.ibm.cics.wlp.threading.CICSPooledThreadFactory.joinAsThreadInternal(CICSPooledThreadFactory.java:409)
at com.ibm.cics.wlp.threading.CICSPooledThreadFactory.joinAsThread(CICSPooledThreadFactory.java:335)
at com.ibm.cics.server.internal.ThreadJoiner.main(ThreadJoiner.java:106)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:90)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
at java.lang.reflect.Method.invoke(Method.java:508)
at com.ibm.cics.server.Wrapper.call_main(Wrapper.java:893)
at com.ibm.cics.server.Wrapper.callOSGiClass(Wrapper.java:2816)
at com.ibm.cics.server.Wrapper.invokeJvmServerOSGiClass(Wrapper.java:2683)
at com.ibm.cics.server.Wrapper.jvmServerOSGiEntry(Wrapper.java:2612)
at com.ibm.cics.osgi.impl.Controller.runService(Controller.java:1413)
at com.ibm.cics.osgi.impl.Controller.acceptRequest(Controller.java:322)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:90)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
at java.lang.reflect.Method.invoke(Method.java:508)
at com.ibm.cics.router.Router.route(Router.java:1317)
Caused by: javax.servlet.ServletException: /pltdisable.xhtml - No saved view 
state could be found for the view identifier: /pltdisable.xhtml
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:214)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1255)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:743)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:440)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1155)
at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:4962)
... 28 more

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Учитывая ваш сценарий, вполне вероятно, что ошибка No saved view state возникает, когда запрос направляется на сервер, отличный от того, на котором начался его сеанс, и этот новый сервер не может обработать состояние просмотра, которое он передал.

Это происходит потому, что в MyFaces по умолчанию включено шифрование состояния просмотра - и по умолчанию секретные ключи для этого шифрования генерируются случайным образом при запуске.Таким образом, при полностью настроенной конфигурации по умолчанию разные серверы в кластере не смогут совместно использовать зашифрованные состояния просмотра, поскольку каждый сервер будет инициализирован с различным случайным секретным ключом.Для совместного использования зашифрованных состояний просмотра между серверами эти серверы должны быть настроены на использование одних и тех же секретных ключей.Они могут быть установлены с помощью следующих параметров веб-конфигурации:

<!-- Defines the secret (Base64 encoded) used to initialize the secret key
     for encryption algorithm. The size of it depends on the algorithm used for encryption -->
<context-param>
    <param-name>org.apache.myfaces.SECRET</param-name>
    <param-value>your_secret_key</param-value>
</context-param>

<!-- Define the initialization code (Bas64 encoded) that are used to initialize the secret key used
     on the Message Authentication Code algorithm. The size of it depends on the algorithm used for mac calculation -->
<context-param>
    <param-name>org.apache.myfaces.MAC_SECRET</param-name>
    <param-value>your_mac_secret_key</param-value>
</context-param>

MyFaces wiki подробно описывает конфигурацию безопасности.Параметры безопасности по умолчанию - в дополнение к вашим секретным ключам - достаточны для безопасного развертывания.

0 голосов
/ 13 февраля 2019

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

Также, если вы по умолчанию используете LTPA для безопасности, вы также должны делиться файлом ltpa.keys между вашими серверами Liberty.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...