アプリケーションに Spring Security を統合しましたが、認証情報が正しくない場合にユーザーにエラー メッセージを表示したいと考えています。jsp:
<c:out value='${secerror}' /> //prints nothing on screen
<c:if test="${empty secerror}">
error is empty or null. //always prints this line on screen
</c:if>
<c:if test="${not empty secerror}">
<div class="errorblock">
Your login attempt was not successful, try again.<br /> Caused :
${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}
</div>
</c:if>
<c:set var = "url" value = "/j_spring_security_check" />
<form:form method="post" commandName="portalLogin" action="${pageContext.servletContext.contextPath}${url}" name="f">
[更新]: 申し訳ありませんが、portalLogin.html にリダイレクトした後、以前に作成した新しいモデル オブジェクトを作成したため、モデル オブジェクトがオーバーライドされていることに気付きました。しかし、Modelオブジェクトをあるコントローラーメソッドから同じコントローラー内の別のメソッドに渡すことができるいくつかの簡単なオプションを試しました。しかし、何も機能しませんでした。
- リダイレクトプレフィックスの代わりに forward: プレフィックスを使用してみました。このため、エラーメッセージはまったく表示されませんでした。
loginerror メソッドで以下のコードを試しました。
return new ModelAndView("portalLogin","secerror","true");
上記のコードで次のエラーが発生しました。
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'portalLogin' available as request attribute
このリンクに出くわしましたが、非常に長い解決策であることがわかり、それほど多くのコードを書く必要があるかどうかわかりませんでした。
@ModelAttribute アノテーション@ModelAttributeに Model オブジェクトを使用できるかどうかはわかりませんでした。
私が試すことができるコード スニペット/例を提供してください。
私のコントローラーメソッドは次のようなものです:
@RequestMapping("/portalLogin")
public ModelAndView goToLogin(Model model) {
try {
System.out.println("Enter goToLogin************************");
} catch (Exception exception) {
}
return new ModelAndView("portalLogin", "portalLogin", new LoginModel());
//return new ModelAndView("portalLogin", model);
}
@RequestMapping(value="/loginfailed", method = RequestMethod.GET)
public ModelAndView loginerror(ModelMap model) {
//model.addAttribute("secerror", "true");
//return "redirect:portalLogin.html";
return new ModelAndView("portalLogin","secerror","true");
}
[更新]: 回避策として、loginerror メソッド内に goToLogin メソッド ロジックを追加しました。私の唯一の目的は portalLogin ページを取得することです。期待どおりにエラーがスローされました。
@RequestMapping(value="/loginfailed", method = RequestMethod.GET)
public ModelAndView loginerror(Model model) {
model.addAttribute("secerror", "true");
return new ModelAndView("portalLogin", "portalLogin", new LoginModel());
}
しかし、モデルオブジェクトをあるコントローラーメソッドから同じコントローラー内の別のメソッドに何らかの方法で渡すことができるかどうかを知りたいです。