在Spring中将重定向设置为自定义AuthenticationFailureHandler的正确方法是什么?
是否可以调用控制器?
代码如下:
@Component
public class MyAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(HttpServletRequest request,
HttpServletResponse response, AuthenticationException exception)
throws IOException, ServletException {
super.onAuthenticationFailure(request, response, exception);
if (exception.getClass().isAssignableFrom(
CustomUsernameNotFoundException.class)) {
// TODO Set the redirect
}
}
}
答案 0 :(得分:4)
尝试这样的事情
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
saveException(request, exception);
//do your things
getRedirectStrategy().sendRedirect(request, response, "/page/login?error=Retry");
}
答案 1 :(得分:2)
您正在调用super.onAuthenticationFailure
,这将重定向到已配置的网址。因此响应已经提交,您无法决定在其他地方重定向。
您可以将SimpleUrlAuthenticationFailureHandler
配置为重定向到一个网址,如果您不打算自行重定向,则只调用超级方法。
或者,直接实现AuthenticationFailureHandler
并在失败方法中实现所需的所有逻辑 - 一旦事情超出一定程度的复杂性,我宁愿完全避免继承:
if (oneCondition) {
// redirect to IdP
} else {
// redirect to registration page
}
答案 2 :(得分:0)
你可以调用一个控制器。,你的代码片段会有帮助,但是从这里讨论的例子中得到这个。
@RequestMapping(value = "/login/failure")
public String loginFailure() {
String message = "Login Failure!";
return "redirect:/login?message="+message;
}
通过查看xml
中的登录映射,确保了解重定向的工作原理答案 3 :(得分:-1)
您可以重定向到特定网址。
response.sendRedirect("/redirect");