我使用Spring(3.1),Spring MVC(3.1)和Spring Security(3.0)在一起的一個JSP頁面上有兩種形式;一種是登錄表單,另一種是註冊表單(即創建新用戶)。Spring 3.1 MVC和安全:同一頁面上的登錄和註冊表單(多個表單)獲取提交
對於註冊表格,我使用Spring form
標籤,由控制器備份以處理請求,但對於登錄表單,我不打擾Spring form
標籤,因爲我不相信它們是必需的。也沒有控制器需要編寫來處理表單提交,因爲只要請求被提交到j_spring_security_check
,Spring Security負責驗證。
註冊表格工作正常,但登錄表單是一個問題。似乎當我點擊登錄表單上的提交按鈕時,註冊表單也被提交,或者至少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)
這是我從那裏你忘了,包括在form:form
中的ModelAttribute屬性的情況下承認,但我當然不希望將此表格提交給我的控制器。
我有一種感覺,我正在犯一個錯誤或一個簡單的解決方案。任何人都可以推薦一個解決這個問題的方法或者一個不同的方法?
這裏是控制器方法處理請求的情況下,以註冊真實需要:
@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"
}
您在成功/失敗登錄後重定向用戶的位置? – Ritesh
成功的登錄提供了不同的jsp頁面,但失敗的登錄提供了相同的頁面,即registration.jsp。 – chrisjleu
其實Ritesh,這給了我一個線索,似乎問題是當登錄失敗,我重定向到相同的JSP,雖然通過不同的控制器方法。我會自己添加一個答案。 – chrisjleu