JSF AJAX和正常重定向登录并返回上一页
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSF AJAX和正常重定向登录并返回上一页相关的知识,希望对你有一定的参考价值。
当前状态 :
如果发生任何会话超时,将执行redirectToLogin
中的FacesAjaxAwareUserFilter
函数。从那里我可以重定向到我需要的任何页面。我在所有情况下都获得了URI。 BalusC,这一切都很好,非常好。 :)
现在问题的第二部分
重定向登录并返回上一页。
对于Eg:
Page 5 ---->登录------>第5页
我已将重定向URI附加到登录URI并从bean中检索值。
但问题是我在用户登录前有2页。登录模式选择页面(即;谷歌身份验证或默认登录)和读取用户名和密码的页面。
如何通过这两个页面传递重定向URI
。
这是我用于在Ajax超时和正常会话超时时重定向的代码。
类FacesAjaxAwareUserFilter
if ("partial/ajax".equals(request.getHeader("Faces-Request"))) {
res.setContentType("text/xml");
res.setCharacterEncoding("UTF-8");
res.getWriter().printf(FACES_REDIRECT_XML, request.getContextPath() + getLoginUrl()+"?redirectUrlPattern="+request.getRequestURI());
}
else {
if (request.getRequestedSessionId()!=null && (!SecurityUtils.getSubject().isAuthenticated() || !request.isRequestedSessionIdValid())) {
response.sendRedirect(getLoginUrl()+"?redirectUrlPattern="+request.getRequestURI());
return;
}
super.redirectToLogin(req, res);
}
使用的方法是FullAjaxExceptionHandlerFactory
中的Omniface
。
我使用了一种将值附加到URI的方法,但它无法识别会话是否过期还是未创建会话(当用户首先登录时)。
问题代码
if (request.getRequestedSessionId()!=null && (!SecurityUtils.getSubject().isAuthenticated() || !request.isRequestedSessionIdValid()))
我正在寻找一种方法来识别登录前创建的新会话的过期会话。
希望以更好的方式实现这一点。
不欢迎使用重定向URL附加当前URI的方法。
我已经找到了解决方案,但我仍然认为它不是最佳解决方案。任何其他答案,非常感谢。
步骤1
配置应用程序以检测Ajax超时和正常超时。 This是我怎么做的.. !!
第2步
发生会话超时时查找URI,使用此方法。
FacesAjaxAwareUserFilter
将为你抓住ServletRequest
和ServletResponse
。您可以使用此形式将其转换为HttpServletRequest
和HttpServletResponse
的形式
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response= (HttpServletResponse) res;
request.getRequestURI()
将为您提供重定向URI
String redirectURI=request.getRequestURI();
现在,您希望将其保存到某个存储空间,以便在任何需要的位置使用它。我发现的唯一方法是使用此附加URL。
res.getWriter().printf(FACES_REDIRECT_XML, request.getContextPath() + "/sessionexpired"+"?redirectUrlPattern="+request.getRequestURI());
要么
response.sendRedirect("/sessionexpired"+"?redirectUrlPattern="+request.getRequestURI());
现在在我的sessionExpiry页面bean的页面加载中,我用它来获取通过URL传递的值
redirectUrl=FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("redirectUrlPattern");
现在使用javascript我将redirectUrl
的值设置为localStorage。 This是如何将值保存到本地存储的。
这是我的sessionexpiry.xhtml页面。
<script type="text/javascript">
function setRedirectURIToLocalStorage(){
if(typeof(Storage)!=="undefined")
{
localStorage.redirectURI=document.getElementById("redirectUrl").value;
window.location.href="/login";
}
}
</script>
</h:head>
<h:body id="body" onload="setRedirectURIToLocalStorage()">
<f:view contentType="text/html">
<h:form prependId="false" >
<h:inputHidden id="redirectUrl" value="#{sessionExpBean.redirectUrl}" />
<h:outputText value="Session Expired... Redirecting...!!"></h:outputText>
</h:form>
</f:view>
</h:body>
该页面将调用
setRedirectURIToLocalStorage()
函数onLoad
,然后将值设置为localStorage。因此,整个浏览器都可以使用重定向值。您可以在任何需要的页面中使用它。!!您需要做的就是检查这个变量localStorage.redirectURI
以上是关于JSF AJAX和正常重定向登录并返回上一页的主要内容,如果未能解决你的问题,请参考以下文章