ApacheShiro:用户在AJAX中进行身份验证,如何在登录后恢复GET变量



在我的JavaEE应用程序中,我使用Apache Shiro[1]进行用户身份验证。我的用户通过GET URL进行导航,例如"/company/index.xhtml?companyId=327"。

我已经启用了程序登录,遵循BalusC:的指南[2]

SavedRequest savedRequest = WebUtils.getAndClearSavedRequest(Faces.getRequest());

我的问题是,当我的情况是带或不带RememberMe的异步POST时,savedRequest.getRequestUrl()不包含前面提到的GET参数;例如,只返回"/company/index.xhtml"。似乎"FacesAjaxAwareUserFilter"(参见[2])没有获取参数。同步GET调用一切正常。

在使用"FacesAjaxAwareUserFilter"的情况下,由于需要身份验证,我如何在shiro重定向后获得get参数?

[1]https://shiro.apache.org/

[2] 关注这篇关于JavaEE和Shiro的精彩文章:http://balusc.blogspot.de/2013/01/apache-shiro-is-it-ready-for-java-ee-6.html

JSF ajax请求被发送到<h:form>生成的URL。然而,默认情况下,这并不完全是包括查询字符串的当前URL,而是不包含查询字符串的默认当前URI。

有几种方法可以解决这个问题。最简单但最丑陋的方法是使用JS:

<h:form id="foo">
    ...
</h:form>
<script>document.getElementById("foo").action += "?" + location.search;</script>

最干净的方法是创建一个自定义ViewHandler,其getActionURL()(如<h:form>所用)将返回带有查询字符串的所需URL。

JSF实用程序库OmniFaces已经有了这样一个基于视图参数的组件:<o:form>,它基本上扩展了<h:form>并支持includeViewParams="true"(与<h:link>完全相同)。

<f:metadata>
    <f:viewParam name="companyId" value="#{bean.company}" />
</f:metadata>
...
<o:form includeViewParams="true">
    ...
</o:form>

相关内容

  • 没有找到相关文章

最新更新