我用容器管理的安全性编写了简单的应用程序.问题是当我登录并打开另一个我注销的页面时,然后我回到第一页,我点击任何链接等或刷新页面我得到这个例外.我想这是正常的(或者可能不是:))因为我退出了会话被破坏了.我该怎么做才能将用户重定向到例如index.xhtml或login.xhtml,并使他免于看到错误页面/消息?
换句话说,如何在我退出后自动将其他页面重定向到索引/登录页面?
这里是:
javax.faces.application.ViewExpiredException: viewId:/index.xhtml - View /index.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)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
at filter.HttpHttpsFilter.doFilter(HttpHttpsFilter.java:66)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
at java.lang.Thread.run(Thread.java:619)
Run Code Online (Sandbox Code Playgroud) 请考虑以下情形.在会话超时(过期)后,我点击了JSF表单的提交按钮.浏览器显示一些异常消息:
ViewExpiredException:无法恢复视图上下文
我想要做的是,在会话过期后自动重定向到网站的主页.这样做的机制是什么?任何帮助将非常感激.
ExceptionHandlerFactory
到目前为止,我遇到的所有示例都将用户重定向到一个viewExpired.jsf
页面,以防ViewExpiredException
被捕获:
public class ViewExpiredExceptionExceptionHandler extends ExceptionHandlerWrapper {
private ExceptionHandler wrapped;
public ViewExpiredExceptionExceptionHandler(ExceptionHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public ExceptionHandler getWrapped() {
return this.wrapped;
}
@Override
public void handle() throws FacesException {
for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
ExceptionQueuedEvent event = i.next();
ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
Throwable t = context.getException();
if (t instanceof ViewExpiredException) {
ViewExpiredException vee = (ViewExpiredException) t;
FacesContext facesContext = FacesContext.getCurrentInstance();
Map<String, Object> requestMap = facesContext.getExternalContext().getRequestMap();
NavigationHandler navigationHandler = …
Run Code Online (Sandbox Code Playgroud) 我已经设置了web.xml,以便任何java.lang.Throwable(即任何未捕获的异常或错误)将转发到错误页面.但是,对于AJAXified组件,异常不会通过此机制路由到错误页面.
我所拥有的测试用例是一个简单CommandButton
的操作方法,它总是抛出一个RuntimeException
.看起来最好的做法是让action方法捕获异常并添加FacesMessage
类型错误严重性.这是人们做的吗?有没有办法配置JSF,以便如果AJAXified组件的支持bean方法抛出异常,可以显示错误页面?
我希望显示<p:growl>
会话已过期.我找到了许多处理会话过期的方法,如会话超时和JSF/PrimeFaces ajax请求上的ViewExpiredException处理,但是我无法将faces消息推送到<p:growl>
.
到目前为止,当HTTP会话在服务器端自动过期时,如何在客户端自动运行一些(JavaScript)代码?
我试图在Tomcat 7应用服务器上设置我的应用程序超时.首先我在web.xml中测试我的超时为一分钟
<session-config>
<session-timeout>1</session-timeout>
</session-config>
Run Code Online (Sandbox Code Playgroud)
and I am using HttpSessionListener to make sure my Timeout is working fine.I declared my sessionListener Class in web.xml .
public class HttpSessionChecker implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
System.out.printf("Session ID %s created at %s%n", event.getSession().getId(), new Date());
}
public void sessionDestroyed(HttpSessionEvent event) {
System.out.printf("Session ID %s destroyed at %s%n", event.getSession().getId(), new Date());
}
}
Run Code Online (Sandbox Code Playgroud)
and In web.xml
<listener>
<listener-class>com.test.util.HttpSessionChecker</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)
But when start my server and launch my application I see session …
我用表单打开一些选项卡,当我按下命令按钮时(会话过期一段时间后),我收到一条 java 脚本警报:
serverError: class javax.faces.application.ViewExpiredException viewId:/register.xhtml - 无法恢复 View /register.xhtml。
在 Firefox 上(本地 glassfish 4)
我已经添加了 :
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/index.xhtml?faces-redirect=true</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)
在我的web.xml
但我没有重定向到我的索引。这是为什么 ?
编辑:示例按钮
<h:commandButton value="Register" action="#{userController.register}">
<f:ajax execute="@form" render="@form" />
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)
UserController 是 ViewScoped
我正在尝试为所有ajax请求配置一个oncomplete方法,以便我可以处理会话超时.
我尝试添加以下脚本但它的工作方式与为p:ajax元素设置oncomplete属性的方式不同.每次发出Ajax请求时都不会执行.
$.ajaxSetup({method: post,
complete: function(xhr, status, args){
var xdoc = xhr.responseXML;
if(xdoc == null){
return;
}
errorNodes = xdoc.getElementsByTagName('error-name');
if (errorNodes.length == 0) {
return;
}
errorName = errorNodes[0].childNodes[0].nodeValue;
errorValueNode = xmlDoc.getElementsByTagName('error-message');
errorValue = errorValueNode[0].childNodes[0].nodeValue;
alert(errorValue);
document.location.href='${pageContext.request.contextPath}/login/login.jsf';
}
});
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激