我正在使用JSF和RichFacecs来创建一个门户网站。我希望在会话超时时将用户重定向到登录页面。我试图在会话到期/注销阶段抛出SecurityException,如下所示
<error-page>
<exception-type>java.lang.SecurityException</exception-type>
<location>/Login.jsf</location>
</error-page>
但这不适合我。处理这个问题的正确方法是什么?
答案 0 :(得分:7)
这应该这样做:
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/sessionExpired.jsf</location>
</error-page>
答案 1 :(得分:4)
你应该在你的web.xml中加一个超时并注册一个超时过滤器,如下所示:Auto-logout in JSF Application 在ajax的情况下,你的重定向必须像这样:
String facesRequestHeader = httpServletRequest
.getHeader( "Faces-Request" );
boolean isAjaxRequest = facesRequestHeader != null
&& facesRequestHeader.equals( "partial/ajax" );
if( isAjaxRequest )
{
String url = MessageFormat.format( "{0}://{1}:{2,number,####0}{3}",
request.getScheme(), request.getServerName(),
request.getServerPort(), timeoutPath );
PrintWriter pw = response.getWriter();
pw.println( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" );
pw.println( "<partial-response><redirect url=\"" + url
+ "\"></redirect></partial-response>" );
pw.flush(););
}
else
{
httpServletResponse.sendRedirect( timeoutPath );
}
答案 2 :(得分:1)
解决方案是使用Richfaces自己的session expired event
。
将此添加到容易过期的页面:
<a4j:region>
<script language="javascript">
A4J.AJAX.onExpired = function(loc, expiredMsg){
alert('expired!');
window.location = "/login.jsf";
}
</script>
</a4j:region>
可以在RichFaces文档中找到更多信息: http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/ArchitectureOverview.html#SessionExpiredHandling
答案 3 :(得分:1)
我在会话到期后发出A4J请求时遇到了一些问题。 我把这个
<context-param>
<param-name>com.sun.faces.enableRestoreView11Compatibility</param-name>
<param-value>true</param-value>
</context-param>
在我的web.xml中,对我来说它解决了这个问题。
答案 4 :(得分:0)
另一种解决方案是创建扩展ViewHandler的CustomViewHandler 并覆盖restoreView方法
@Override
public UIViewRoot restoreView(FacesContext facesContext, String viewId) {
/**
* {@link javax.faces.application.ViewExpiredException}. This happens only when we try to logout from timed out pages.
*/
UIViewRoot root = null;
root = parent.restoreView(facesContext, viewId);
if(root == null) {
root = createView(facesContext, viewId);
}
return root;
}
然后你需要将它添加到你的faces-config.xml
<view-handler>com.demo.CustomViewHandler</view-handler>
这将阻止您获得ViewExpiredException的