我使用了一个关于这个链接的教程:
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}
有什么想法吗?非常感谢
2条答案
按热度按时间bf1o4zei1#
在验证失败时,您已要求重定向到其他页面。
您的loginfailed jsp没有显示?它没有div,如登录页面中的errorblock?您是否在loginfailed.jsp中看到不同的错误?
编辑:
好的,我知道了。在
authentication-failure-handler-ref="myAuthErrorHandler"
之前,Spring处理失败的情况,并将消息放置在带有密钥SPRING_SECURITY_LAST_EXCEPTION
的会话中。添加失败处理程序(即
authentication-failure-handler-ref="myAuthErrorHandler"
你必须处理这个错误。你可以在会话中设置消息。或者简单地调用
super.onAuthenticationFailure
。你的处理程序没有做任何事情!!!sc4hvdpw2#
使用此命令,删除表单login.jsp
创建属性文件名为
并将其保存到项目类路径中
并将bean添加到spring-contex.xml中