我正在组合使用 Spring (3.1)、Spring MVC (3.1) 和 Spring Security (3.0),并且我将一个 JSP 页面放在一起,上面有两个表单;一个是登录表格,另一个是注册表格(即创建新用户)。
对于注册表单,我使用 Springform
标签,由控制器支持来处理请求,但对于登录表单,我不关心 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"
}