4

我正在 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”url。问题是我不知道如何捕获“错误”变量并在 index.xhtml 文件中显示一些身份验证失败消息。我没有使用 Spring mvc。

第二个问题是更改 authentication-failure-url 不起作用。

<security:form-login
    authentication-failure-url="/error.xhtml"
    default-target-url="/SomeDefaultUrl.xhtml"
    login-page="/index.xhtml" />

我更改了 authentication-failure-url,但尽管进行了此更改,它仍然重定向到 index.xhtml 文件而没有任何变量。

我怎么解决这个问题?

4

4 回答 4

3

如果您index.xhtml是 JSP,您可以这样做(直接来自 Spring 3 食谱书):

<%@ 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>
于 2012-12-05T09:56:05.837 回答
1

重要提示:作为参数/index.xhtml?error=true发送。errorGET

如果您index.xhtml是 JSP 文件,则可以使用隐式request引用访问该参数:

<%= request.getParameter("error") %>

如果index.xhtml是您的 Web 控制器方法/servlet 的 URL,您需要从对象中获取error参数。Request

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException 
{       
    String error = req.getParameter("error");
}

最后,如果你index.xhtml是一个普通的 html 文件,你可以使用 Java Script 来获取那个参数: How to retrieve GET parameters from javascript?

对于第二个问题:确保正确重建项目。看起来它没有注意到你的变化。

于 2012-12-04T12:45:21.077 回答
0
<security:form-login
    authentication-failure-url="/error.xhtml"
    default-target-url="/SomeDefaultUrl.xhtml"
    login-page="/index.xhtml" />

“我更改了 authentication-failure-url,但尽管进行了更改,它仍然重定向到 index.xhtml 文件,没有任何变量。”

答:<http auto-config="true" use-expressions="true"></http>请在您的正文中定义以下拦截网址。

<intercept-url pattern="/error.xhtml" access="permitAll"/>

您可能没有定义对/error.xhtml的访问权限,这就是为什么authentication-failure-url值是不可接受的,并且正在进入下一个定义的逻辑 url,即/index.html

于 2013-04-05T18:22:56.607 回答
0

这里没有一个解决方案对我有用,然后我发现了这个问题,它对我来说有正确的解决方案: spring security 3.1。带有 url 参数的自定义 authentication-failure-url

于 2013-09-11T20:06:08.820 回答