我目前正在开发一个登录更改密码部分,其中的验证由为用户注册的身份验证策略驱动。
我有以下 Controller ,该 Controller 调用身份验证服务,该服务将检查密码是否与用户身份验证策略设置的所有规则匹配:
@RequestMapping(value = "/changepw", method = RequestMethod.POST)
public String changePw(@RequestParam(value = "username") final String username,
@Valid @ModelAttribute("changePw") final ChangePasswordForm changePasswordForm, final BindingResult errors) {
this.log.debug("Entering password change");
try {
final LoginResult result = this.authService.changePassword(changePasswordForm.getUsername(),
changePasswordForm.getOldPassword(), changePasswordForm.getNewPassword1(), changePasswordForm.getNewPassword2());
this.log.debug("login result: {}", result);
if (result.getResultCode() == CODE.ERROR) {
this.log.error(result.getErrorMessage());
errors.reject(result.getErrorMessage());
return "redirect:/login/changepw/";
}
if (result.getResultCode() == CODE.SUCCESS) {
return "redirect:/login/login";
}
errors.reject("error.login.unknown.error");
return "redirect:/login/changepw/";
} catch (final Exception e) {
errors.reject("error.login.catch.error");
return "redirect:/login/changepw";
}
}
我的LoginResult基本上只是一个bean
public class LoginResult implements Serializable {
private static final long serialVersionUID = 6058401105878015102L;
public enum CODE {
SUCCESS,
ERROR,
CHANGE_PASSWORD
}
private CODE resultCode;
private String errorMessage;
//constructors getters setters.
方法changePassword基本上返回
CODE.SUCCESS,null
或CODE.ERROR, error.whatever.code
现在我想做的是将error.code显示在我的jsp的第一个输入上方的div中。
这是我的jsp:
<form:form commandName="changePw" method="POST">
<form:errors cssClass="errorBlock" element="div"/>
<div class="form_block">
<form:label path="username"><spring:message code="prompt.label.username"/></form:label>
<form:input path="username"/>
</div>
<div class="form_block">
<form:label path="oldPassword"><spring:message code="prompt.label.oldpassword"/></form:label>
<form:password path="oldPassword"/>
<div class="capsLockImage control" id="capsLockImage1" title="<spring:message code="prompt.caps_lock"/>"></div>
</div>
<div class="form_block">
<form:label path="newPassword1"><spring:message code="prompt.label.newpassword1"/></form:label>
<form:password path="newPassword1"/>
<div class="capsLockImage control" id="capsLockImage2" title="<spring:message code="prompt.caps_lock"/>"></div>
</div>
<div class="form_block">
<form:label path="newPassword2"><spring:message code="prompt.label.newpassword2"/></form:label>
<form:password path="newPassword2"/>
<div class="capsLockImage control" id="capsLockImage3" title="<spring:message code="prompt.caps_lock"/>"></div>
</div>
<input type="submit" value="<spring:message code="prompt.label.changepw"/>"/>
到目前为止,该错误已在BindingResult中注册,但不会返回 View 。使该工作最佳的做法是什么?
最佳答案
发生这种情况是因为您将重定向到 View -并且存储在BindingResult
中的错误会丢失。
如果发生错误,最好还是返回到changepw
View -例如:
if (result.getResultCode() == CODE.ERROR) {
this.log.error(result.getErrorMessage());
errors.reject(result.getErrorMessage());
return "changepw"; // Or whatever the jsp view is called
}
如果您无法执行此操作,则必须将错误存储在 session 中,以便重定向请求返回后即可使用。
为此,您可以在更高版本的Spring中显式使用
HttpSession
或RedirectAttributes
-如本文所解释:Spring - Redirect after POST (even with validation errors)
关于jsp - Spring MVC返回要在 View 中显示的服务层错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20282217/