在我的JavaEE-Application中,我使用Apache Shiro [1]进行用户身份验证。 我的用户通过GET-URL导航,例如“/company/index.xhtml?companyId=327”。
我已按照BalusC的指南[2]启用了程序化登录:
SavedRequest savedRequest = WebUtils.getAndClearSavedRequest(Faces.getRequest());
我的问题是, savedRequest.getRequestUrl()不包含前面提到的GET参数,当我的情况是带或不带RememberMe的异步POST时;例如,返回“/company/index.xhtml”。似乎“FacesAjaxAwareUserFilter”(见[2])并不是GET-params意识到的。在同步GET调用时,一切正常。
如果在使用“FacesAjaxAwareUserFilter”时需要进行身份验证,如何在shiro-redirect之后获取GET参数?
[2]关于JavaEE和Shiro这篇伟大的文章:http://balusc.blogspot.de/2013/01/apache-shiro-is-it-ready-for-java-ee-6.html
答案 0 :(得分:4)
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>
使用)将返回带有查询字符串的所需网址。
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>