2

在我的 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 参数。在同步 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

4

1 回答 1

4

JSF ajax 请求被发送到由<h:form>. 然而,默认情况下,这并不完全是包含查询字符串的当前 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>
于 2013-02-07T11:24:01.977 回答