核心思路:新建一个修改密码页面,依然是用 Parsley 进行表单验证,需要设定三个Validator,一个是确定旧密码是否正确,一个是确定新密码和旧密码不同,一个是让两次确认密码一致。

后端则仅创建两个接口:

  • checkPassword,通过传入的密码判断是否正确,用于第二个Validator
  • user/modify,传入新的密码,将其修改,并顺手删去Session中的username 在确认旧密码/更新密码中,查表需要得到username,直接通过Session获取即可。

前端

表单:

<form id="form" data-parsley-validate="">  
  <div class="form-group">  
    <label for="old-password">旧密码</label>  
    <input type="password" class="form-control" name="oldpwd" id="old-password" placeholder="输入账号的原登录密码" required="" data-parsley-old-password="" data-parsley-trigger="focus">  
  </div>  
  <div class="form-group">  
    <label for="new-password">新密码</label>  
    <input type="password" class="form-control" name="newpwd" id="new-password" placeholder="输入新的密码" required="" data-parsley-trigger="change" data-parsley-not-equal="">  
  </div>  
  <div class="form-group">  
    <label for="confirm-password">确认新密码</label>  
    <input type="password" class="form-control" name="confirmpwd" id="confirm-password" placeholder="请确认新的密码" required="" data-parsley-trigger="change" data-parsley-confirm-password="">  
  </div>  
  <input type="submit" class="btn btn-primary" value="修改密码">  
</form>

parsley 校验:

$('#form').parsley().on('field:validated', function() {
    let ok = $('.parsley-error').length === 0;
    if(ok)
      console.log("校验通过")
    else
      console.log("校验不通过")
  }).on('form:submit', function() {
 
    submit()
    return false; // Don't submit form for this demo
  });
 
  window.ParsleyValidator.addValidator('confirmPassword', {
    requirementType: 'string',
    validateString: function(value, requirement) {
 
      return value === $('#new-password').val();
    }
  }).addMessage('zh-cn', 'confirmPassword', '两次输入的密码不一致')
          .addValidator('notEqual', {
            requirementType: 'string',
            validateString: function(value, requirement) {
              return value !== $('#old-password').val();
            },
            messages: {
              'zh-cn': '新密码不能和旧密码相同'
            }
          })
          .addValidator('oldPassword', {
            requirementType: 'string',
            validateString: function(value, requirement) {
              let response = true;
              $.ajax({
                url: '/user/checkPassword',
                type: 'post',
                dataType: 'json',
                async: false,
                data: {
                  password: value
                },
                success: function (data) {
                  console.log(data.success);
                  if(data.success)
                    response = true;
                  else
                    response = false;
                },
                error: function (data) {
                  console.log(data);
                  response = false;
                }
              });
              console.log("response:" + response);
              return response;
            },
            messages: {
              'zh-cn': '旧密码不正确'
            }
          },32)
 
 
 
  async function submit () {
    let password = $('#new-password').val();
    let data = {
      password: password
    }
    lightyear.loading('show');
    await axios.post('/user/modify', data, {
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      }}).then(function (response) {
      console.log(response);
      if (response.data.success === true) {
        lightyear.loading('hide');
        lightyear.notify('修改成功!请重新登录', 'success');
        setTimeout(function() {
          window.location.href = '/login';
        }, 2000);
        // window.location.href = '/login';
      } else {
        // 假设ajax提交操作
        setTimeout(function() {
          lightyear.loading('hide');
          lightyear.notify(response.data.message, 'danger');
        }, 500)
      }
    }).catch(function (error) {
      console.log(error);
    });
    // return false; // Don't submit form for this demo
  }

后端

@PostMapping(value = "/user/modify", produces = "application/json;charset=UTF-8")  
@ResponseBody  
public Response modify(String password, HttpSession session) {  
    log.info("newPassword: " + password);  
    String username = (String) session.getAttribute("username");  
    Response response = userService.modifyUser(username, password);  
    if(response.isSuccess()) {  
        session.removeAttribute("username");  
    }    return response;  
}  
  
@PostMapping(value = "/user/checkPassword", produces = "application/json;charset=UTF-8")  
@ResponseBody  
public Response checkPassword(String password, HttpSession session) {  
    String username = (String) session.getAttribute("username");  
    log.info("username: " + username + ", password: " + password);  
    Response response = userService.authenUser(username, password);  
    if (response.isSuccess()) {  
        return Response.success("密码正确");  
    }    return Response.failure("旧密码错误");  
}