Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 使用JavaEE6干净地处理会话超时_Security_Jsf 2_Java Ee 6_Viewexpiredexception - Fatal编程技术网

Security 使用JavaEE6干净地处理会话超时

Security 使用JavaEE6干净地处理会话超时,security,jsf-2,java-ee-6,viewexpiredexception,Security,Jsf 2,Java Ee 6,Viewexpiredexception,我在GlassFish 3.0.1中部署了一个相当简单的web应用程序。我使用常规的基于表单的身份验证,并使用JDBC域保护应用程序。JSF2使用Facelets处理该视图 我遇到的问题是,当会话过期时,如果用户单击h:commandButton或任何其他发回的按钮,就会出现一个糟糕的黄页,告诉他们发生了XML解析错误。在日志中,我得到了三个堆栈跟踪: INFO: PWC2787: Session event listener threw exception org.jboss.weld.con

我在GlassFish 3.0.1中部署了一个相当简单的web应用程序。我使用常规的基于表单的身份验证,并使用JDBC域保护应用程序。JSF2使用Facelets处理该视图

我遇到的问题是,当会话过期时,如果用户单击h:commandButton或任何其他发回的按钮,就会出现一个糟糕的黄页,告诉他们发生了XML解析错误。在日志中,我得到了三个堆栈跟踪:

INFO: PWC2787: Session event listener threw exception
org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.RequestScoped
at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:679)
at org.jboss.weld.bean.proxy.ClientProxyMethodHandler.getProxiedInstance(ClientProxyMethodHandler.java:138)
at org.jboss.weld.bean.proxy.ClientProxyMethodHandler.invoke(ClientProxyMethodHandler.java:100)
<snip>

WARNING: ApplicationDispatcher[/core] PWC1231: Servlet.service() for servlet Faces Servlet threw exception
javax.faces.application.ViewExpiredException: viewId:/login.xhtml - View /login.xhtml could not be restored.
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:212)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:110)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
<snip>

WARNING: Unexpected error forwarding or redirecting to login page
javax.servlet.ServletException: viewId:/login.xhtml - View /login.xhtml could not be restored.
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:822)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:517)
<snip>
INFO:PWC2787:会话事件侦听器引发异常
org.jboss.weld.context.contextNotActivieException:weld-001303作用域类型javax.enterprise.context.RequestScoped没有活动上下文
位于org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:679)
位于org.jboss.weld.bean.proxy.ClientProxyMethodHandler.getProxiedInstance(ClientProxyMethodHandler.java:138)
位于org.jboss.weld.bean.proxy.ClientProxyMethodHandler.invoke(ClientProxyMethodHandler.java:100)
警告:Servlet的ApplicationDispatcher[/core]PWC1231:Servlet.service()面临Servlet抛出异常
javax.faces.application.ViewExpiredException:viewId:/login.xhtml-无法还原视图/login.xhtml。
位于com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:212)
位于com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
位于com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:110)
在com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)上
警告:转发或重定向到登录页时发生意外错误
javax.servlet.ServletException:viewId:/login.xhtml-无法还原视图/login.xhtml。
位于javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)
位于org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
位于org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:822)
位于org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
位于org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:517)
我似乎找不到一个干净简单的方法来处理这个问题。我已尝试在web.xml中为ViewExpiredException设置错误处理程序,但从未调用它。我猜这个系统已经因为第一个例外而放弃了。现在我真的不太在乎在这种情况下我把用户送到哪里,只要他们没有看到死亡的黄页


注意:非回发链接可以正确查找并重定向到登录页面。

不幸的是,没有标准的方法来解决这个问题,至少在做了大量研究后,我们没有发现任何问题

您可以做的是:

(1) 在faces-config.xml中注册您自己的JSF ExceptionHandler,并使其处理您想要的任何异常,然后重定向到error-/login页面。不完全是琐碎的,但绝对有可能——我们就是这样做的

(2) 看一看(并使用),他们使用的是相同的机制(但以更优雅的符合CDI的方式),我们没有使用它,因为它在两个月前还没有准备好