JSF AJAX和正常重定向登录并返回上一页

问题描述 投票:0回答:1

当前状态 :

如果发生任何会话超时,将执行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的方法。

session jsf-2
1个回答
0
投票

我已经找到了解决方案,但我仍然认为它不是最佳解决方案。任何其他答案,非常感谢。

步骤1

配置应用程序以检测Ajax超时和正常超时。 This是我怎么做的.. !!

第2步

发生会话超时时查找URI,使用此方法。

FacesAjaxAwareUserFilter将为你抓住ServletRequestServletResponse。您可以使用此形式将其转换为HttpServletRequestHttpServletResponse的形式

        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的值设置为localStorageThis是如何将值保存到本地存储的。

这是我的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

© www.soinside.com 2019 - 2024. All rights reserved.