jsp - Spring MVC返回要在 View 中显示的服务层错误代码

标签 jsp validation spring-mvc error-handling

我目前正在开发一个登录更改密码部分,其中的验证由为用户注册的身份验证策略驱动。

我有以下 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,nullCODE.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中显式使用HttpSessionRedirectAttributes-如本文所解释:Spring - Redirect after POST (even with validation errors)

关于jsp - Spring MVC返回要在 View 中显示的服务层错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20282217/

相关文章:

java - 使用 <c :import> 时出现 JSTL 日期格式问题

java - JSP中如何检测用户是否刷新页面?

javascript - 在验证时阻止日历控件打开

javascript - 如何检查字符串是否为有效数字?

java - 无法从 Spring 应用程序上下文创建 ThreadPoolExecutor

html - Thymeleaf 在使用 Spring MVC @PathVariable 时无法解析静态资源

java - Eclipse WTP : "The import ___ cannot be resolved for" error in a JSP file for a class defined in project

java - 在 MySQL 数据库中检索非英文字符插入值

Powershell 验证电子邮件地址

java - Ajax 看不到 Post Controller