0

После следующее исключения пользователя выдастся-х перенаправлен из сессионного компонента:Отправка формы в IFRAME в IE11 бросает java.lang.StringIndexOutOfBoundsException при восстановлении JSF состояний

StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(String.java:1911 
at com.sun.faces.renderkit.ServerSideStateHelper.getState(ServerSideStateHelper.java:266 
at com.sun.faces.renderkit.ResponseStateManagerImpl.getState(ResponseStateManagerImpl.java:100 
at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:227 
at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:188 
at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123 
at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:453 
at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:148 
at javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:303 
at org.omnifaces.viewhandler.RestorableViewHandler.restoreView(RestorableViewHandler.java:66 
at javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:303 
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:192 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101 
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116 
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593 
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161 
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231 
at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317 
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195 
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860 
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757 
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056 
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229 
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137 
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104 
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90 
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79 
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54 
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59 
at com.sun.grizzly.ContextTask.run(ContextTask.java:71 
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532 
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513 
at java.lang.Thread.run(Thread.java:745) 

Код кнопки использует атрибут actionListener:

actionListener="#{aController.aMethod}" 

контроллер выполняет перенаправление так:

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext(); 
HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); 
String encodedURL = response.encodeURL(context.getRequestContextPath() + "/page.xhtml?faces-redirect=true"); 
context.redirect(encodedURL); 

Моя сессия конфигурации:

<session-config> 
    <session-timeout>60</session-timeout> 
    <tracking-mode>URL</tracking-mode> 
</session-config> 

Страница содержит только одну единственную форму (а также сгенерированные HTML), определяется:

<form id="wrapper" name="wrapper" method="post" action="/ACETOwebkalender/a/b.xhtml" enctype="application/x-www-form-urlencoded"> 

Внешние страницы использует Slider Revolution Responsive WordPress Plugin, который использует jQuery.ajax. Может ли это породить проблему?

Эта проблема возникает только в IE11 и Safari, когда страница встроена в другую страницу с использованием iFrame.

+0

Обновленная полная трассировка стека –

+0

Вы правы, удаление OmniFaces не устраняет эту проблему. –

+0

Это не тот случай. Обновлено сообщение. –

ответ

0

Исправлена ​​ошибка для Safari с помощью следующего фрагмента кода на каждой странице:

<script> 
    window.onload = function() { 
     if (top != self) { // If true, then page is been requested inside an iframe. 
      var jsessionid = '#{session.id}'; 
      var forms = document.forms; 

      for (i = 0; i &lt; forms.length; i++) { 
       forms[i].action += ';JSESSIONID=' + jsessionid; 
      } 
     } 
    }; 
</script> 

А для IE, я обновил web.xml к следующему:

.... 
<filter> 
    <filter-name>P3P Response Filter</filter-name> 
    <filter-class>util.ResponseFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>P3P Response Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
<session-config> 
    <session-timeout>60</session-timeout> 
    <cookie-config> 
     <http-only>true</http-only> 
     <secure>true</secure> 
    </cookie-config> 
    <tracking-mode>COOKIE</tracking-mode> 
    <tracking-mode>URL</tracking-mode> 
</session-config> 
... 

Где ResponseFilter.class является:

import java.io.IOException; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletResponse; 

public class ResponseFilter implements Filter { 

@Override 
public void init(FilterConfig filterConfig) throws ServletException {} 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    HttpServletResponse resp = (HttpServletResponse) response; 
    resp.addHeader("P3P", "CP=\"DC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""); 
    chain.doFilter(request, resp); 
} 

@Override 
public void destroy() {} 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^