我正在 Spring 上开发 Web 应用程序,其中使用 Spring Security 3 和 LDAP 进行身份验证。
这是我的代码中的表单登录代码段:
<security:form-login
authentication-failure-url="/index.xhtml?error=true"
default-target-url="/SomeDefaultUrl.xhtml"
login-page="/index.xhtml" />
当身份验证失败时,我的应用程序被重定向到"/index.xhtml?error=true"网址。问题是我不知道如何捕获"错误"变量并在index.xhtml文件中显示一些身份验证失败消息。我没有使用Spring mvc。
第二个问题是更改身份验证失败网址不起作用。
<security:form-login
authentication-failure-url="/error.xhtml"
default-target-url="/SomeDefaultUrl.xhtml"
login-page="/index.xhtml" />
我更改了身份验证失败网址,但尽管进行了此更改,它仍然重定向到没有任何变量的索引.xhtml文件。
如何解决这个问题?
如果你的index.xhtml
是JSP,你可以这样做(直接从Spring 3 Rerecies书):
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${not empty param.error}">
Login error.
Reason ${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}
</c:if>
重要提示:/index.xhtml?error=true
error
作为参数发送GET
。
如果您的index.xhtml
是 JSP 文件,则可以使用隐式request
引用来访问该参数:
<%= request.getParameter("error") %>
如果index.xhtml
是Web控制器方法/servlet的URL,则需要从Request
对象中获取error
参数。
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
{
String error = req.getParameter("error");
}
最后,如果你的index.xhtml
是一个纯 html 文件,你可以使用 Java 脚本来获取该参数:如何从javascript中检索GET参数?
对于第二个问题:确保正确重新生成项目。看起来它没有注意到您的更改。
<security:form-login
authentication-failure-url="/error.xhtml"
default-target-url="/SomeDefaultUrl.xhtml"
login-page="/index.xhtml" />
"我更改了身份验证失败网址,但尽管如此,它仍然重定向到索引.xhtml文件,没有任何变量。"
答:请在您的<http auto-config="true" use-expressions="true"></http>
体内定义以下拦截网址。
<intercept-url pattern="/error.xhtml" access="permitAll"/>
您可能没有定义对 /error 的访问权限.xhtml这就是为什么身份验证失败网址值不可接受并且会下降到定义的下一个逻辑 url(即 /index)的原因.html
这里没有一个解决方案对我有用,然后我找到了这个问题,它对我有正确的解决方案:春季安全性 3.1.具有 URL 参数的自定义身份验证失败 URL