Apache-Shiro:用户在 AJAX 中进行身份验证,登录后如何恢复 GET-Variables?

Posted

技术标签:

【中文标题】Apache-Shiro:用户在 AJAX 中进行身份验证,登录后如何恢复 GET-Variables?【英文标题】:Apache-Shiro: User authenticates within AJAX, how to restore GET-Variables after login? 【发布时间】:2013-01-21 12:22:00 【问题描述】:

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

我已按照 BalusC 的指南 [2] 启用了编程登录:

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

我的问题是,savedRequest.getRequestUrl() 不包含前面提到的 GET 参数,当我的情况是异步 POST 有或没有 RememberMe 时;例如,仅返回“/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

【问题讨论】:

【参考方案1】:

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

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

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

最简洁的方法是创建一个自定义ViewHandler,其getActionURL()(由&lt;h:form&gt; 使用)将返回带有查询字符串的所需URL。

JSF 实用程序库OmniFaces 已经有这样一个组件,它基于视图参数执行此操作:&lt;o:form&gt;,它基本上扩展了&lt;h:form&gt;,支持includeViewParams="true"(与&lt;h:link&gt; 完全相同) .

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

【讨论】:

以上是关于Apache-Shiro:用户在 AJAX 中进行身份验证,登录后如何恢复 GET-Variables?的主要内容,如果未能解决你的问题,请参考以下文章

Apache-Shiro 和 Chrome [关闭]

Apache-Shiro分布式环境配置(与redis集成)(转)

apache-shiro 的怪事通过 spring-boot 集成到 spring-mvc 中

使用 laravel 进行 ajax 验证后的新用户

13. Ajax技术

JQuery Ajax - 如何在进行 Ajax 调用时检测网络连接错误