首页 > 解决方案 > httpd/mod_auth_form 如何在无效凭据上显示错误消息?

问题描述

使用带有 ErrorDocument 401 的内联表单,如何在用户登录失败时显示错误消息?

预期的功能仍然有效(例如登录重定向)。在用户的浏览器中看不到登录/注销 URL。当用户注销时,当他们 401 回到内联登录页面时,不应显示该消息。

我目前正在使用一个onsubmit函数在sessionStorage. 如果页面加载(正文onload函数)并看到此标志,它将显示错误消息(例如,用户输入了错误的凭据并再次返回此处)。这工作正常,直到他们注销。他们是 401'd 到登录页面并且标志仍然存在,所以他们看到错误消息。

我需要以某种方式清除消息。

好吧,GET vs POST!初始页面加载是 GET,注销是 GET;因此,只有失败的登录才会使用 POST 加载此页面。

让我们激活 SSI 并使用 env var(这在登录和注销位置指令中):

SetEnvIf Request_Method "^GET$" LOGIN-ERROR-CLEAR="1"

在我们的init中注入一些JS来清除sessionStorage:

<!--#if expr="reqenv('LOGIN-ERROR-CLEAR') == '1'" -->
sessionStorage.removeItem('login-attempted');
<!--#endif -->

听起来合乎逻辑……但是,它不起作用。JS没有注入。

所有 GET,但未注入 JS。到底是怎么回事?我回到了使用 SetEnvIf 之前的起点——没有区别。它什么也没做!

有没有更好的方法来触发错误消息并在成功登录或注销后清除触发器?这不应该这么难!

标签: apachemod-auth-form

解决方案


发现我可以直接在 SSI 中使用变量;所以,我SetEnvIf从我的虚拟主机中删除了 s 。此外,REQUEST_METHOD 是错误的使用方法。REDIRECT_REQUEST_METHOD 是要查找的方法。最后,这似乎有效:

<!--#comment This block uses SSI/mod_include. -->
<!--#if expr='v("REDIRECT_REQUEST_METHOD") == "GET"' -->
sessionStorage.removeItem('login-attempted');
<!--#endif -->

推荐阅读