未显示Spring Security自定义错误消息

62o28rlo  于 2022-11-24  发布在  Spring
关注(0)|答案(2)|浏览(179)

我使用了一个关于这个链接的教程:
http://www.mkyong.com/spring-security/display-custom-error-message-in-spring-security/
在登录表单上显示一个自定义错误消息,我在一开始就得到了它。但是在为一个自定义失败验证器处理程序声明了**authentication-failure-handler-ref=“myAuthErrorHandler”**之后,我在登录表单上看不到它的自定义消息:

我做错了什么?谁能解释一下发生了什么,为什么“无效的用户名或密码”没有显示?
代码如下:

验证侦听器

public class AuthentificationListener implements AuthenticationFailureHandler {

@Override
public void onAuthenticationFailure(HttpServletRequest request,
        HttpServletResponse response, AuthenticationException ae)
        throws IOException, ServletException {

    UsernamePasswordAuthenticationToken user = (UsernamePasswordAuthenticationToken) ae
            .getAuthentication();

    /* User */

    response.sendRedirect(request.getContextPath()
            + "/abc/main/loginfailed");

}

}

应用程序上下文.xml:

<bean id="myAuthErrorHandler" class="org.abc.handler.AuthentificationListener"/>

Spring安全性:

<http auto-config="true">
    <intercept-url pattern="/abc/main/welcome*" access="ROLE_USER" />
    <intercept-url pattern="/abc/main/record/**" access="ROLE_USER" />

    <form-login 

    login-page="/abc/main/login" 

    authentication-failure-handler-ref="myAuthErrorHandler" 

    default-target-url="/abc/main/welcome"

    />

    <logout logout-success-url="/abc/main/logout" />

</http>

登录.jsp:

<c:if test="${not empty error}">
        <div class="errorblock">
            Your login attempt was not successful, try again.<br /> Caused :
            ${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}
        </div>

    </c:if>

登录控制器.java:

@RequestMapping(value="/loginfailed", method = RequestMethod.GET)
public String loginerror(ModelMap model) {

    model.addAttribute("error", "true");
    return "login";

}

更新:为了回答Mani问题,我使用了一个LoginController,它将loginfailed请求重定向到login.jsp,并发送一个值为'true'的'error'属性。问题是我无法使用以下表达式在 login.jsp 上看到消息:

${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}

有什么想法吗?非常感谢

bf1o4zei

bf1o4zei1#

在验证失败时,您已要求重定向到其他页面。

response.sendRedirect(request.getContextPath()
        + "/abc/main/loginfailed");

您的loginfailed jsp没有显示?它没有div,如登录页面中的errorblock?您是否在loginfailed.jsp中看到不同的错误?
编辑:
好的,我知道了。在authentication-failure-handler-ref="myAuthErrorHandler"之前,Spring处理失败的情况,并将消息放置在带有密钥SPRING_SECURITY_LAST_EXCEPTION的会话中。
添加失败处理程序(即
authentication-failure-handler-ref="myAuthErrorHandler"
你必须处理这个错误。你可以在会话中设置消息。或者简单地调用super.onAuthenticationFailure。你的处理程序没有做任何事情!!!

sc4hvdpw

sc4hvdpw2#

<div style="color: red">
    Your login attempt was not successful, try again.<br /> Caused :
    ${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}
</div>

使用此命令,删除表单login.jsp
创建属性文件名为

  • mymessages.properties
  • 用户名或密码无效

并将其保存到项目类路径中
并将bean添加到spring-contex.xml中

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>mymessages</value>
        </list>
    </property>
</bean>

相关问题