Spring (3.1)、Spring MVC (3.1)、および Spring Security (3.0) を組み合わせて使用し、2 つのフォームを持つ単一の JSP ページをまとめました。1 つはログインするためのフォームで、もう 1 つは登録するためのフォームです (つまり、新しいユーザーを作成します)。
登録フォームではform
、コントローラーによってバックアップされた Spring タグを使用してリクエストを処理しますが、ログイン フォームでは、Springform
タグが必要だとは思わないので気にしません。リクエストが に送信されている限り、Spring Security が認証を処理するため、フォームの送信を処理するために記述する必要のあるコントローラーもありませんj_spring_security_check
。
登録フォームは正常に機能していますが、ログイン フォームに問題があります。ログインフォームの送信ボタンをクリックすると、登録フォームも送信されるか、少なくともSpringはそのフォームを送信しようとしていると考えています。JSP は次のとおりです。
<form id="loginform" method="POST" action="<c:url value='j_spring_security_check'/>">
<label for="existing_email">Email:</label>
<input name="j_username" id="existing_email" type="text" value="${SPRING_SECURITY_LAST_USERNAME}" />
<label for="existing_password">Password:</label>
<input name="j_password" id="existing_password" type="password" />
<input id="login-form-submit" type="submit" value="Sign in" />
</form>
<form:form id="registrationform" modelAttribute="user" method="POST" action="register">
<form:label path="username" for="email">Email:</form:label>
<form:input path="username" name="username" id="email" type="text" />
<form:errors path="username" cssClass="formError" />
<form:label path="password" for="password">Password:</form:label>
<form:input path="password" name="password" id="password" type="password" />
<form:errors path="password" cssClass="formError" />
<input id="registration-form-submit" type="submit" value="Sign up" />
</form:form>
タイプ送信の入力のform
タグが存在しないことに注意してください。これは、私が見た例では通常のことのようです。フォームタグを送信ボタンに追加しても、ターゲットオブジェクト (この場合はユーザー)の何にもマップされないため、意味がないと思います。
「サインイン」ボタンをクリックすると、次の例外が発生します。
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/project1] threw exception [An exception occurred processing JSP page /WEB-INF/views/registration.jsp at line 29
28: <form:form id="registrationform" modelAttribute="user" method="POST" action="register">
29: <form:label path="username" for="username">Username:</form:label>
30: <form:input path="username" name="username" id="username" type="text" />
31: <form:errors path="username" cssClass="formError" />
32:
Stacktrace:] with root cause
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'user' available as request attribute
at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:141)
これは、modelAttribute 属性を に含めるのを忘れた場合から認識していますform:form
が、もちろん、このフォームをコントローラーに送信したくありません。
私が犯している間違いや簡単な解決策があると感じています。これを回避する方法、またはおそらく別のアプローチを推奨できる人はいますか?
必要な場合に備えて、登録要求を処理するコントローラー メソッドを次に示します。
@RequestMapping(value = "**/register", method = RequestMethod.POST)
public String registerUser(@ModelAttribute("user") @Validated User user, BindingResult errors, ModelMap model) {
if (errors.hasErrors()) {
return "registration";
}
// Other stuff then...
return "profile"
}