超详细 Java修改密码功能的实现(前端+后端)

本文详细阐述了前端界面设计,包括旧密码、新密码和确认密码的输入验证,以及前端校验与后台校验流程。后端代码展示了Spring MVC中的密码修改API和安全策略。重点在于前端JavaScript验证和后端Java处理的实现细节。
摘要由CSDN通过智能技术生成

一、画面设计

说明
① 旧密码、新密码、确认新密码三个输入框均为必填项;
② 新密码、确认新密码必须一致,且为6-16位字母、数字或者符号其中任意两种的组合;
③ 修改成功后,保存按钮不可点击;
④ 清空按钮,清楚输入框中内容和提示信息。

1、初始画面

在这里插入图片描述

2、前端校验画面

旧密码为空时
新密码为空时
确认新密码为空时

密码格式错误时
新密码确认错误时

3、后台校验画面

旧密码错误时
密码修改成功时

4、清空画面

点击清空按钮

二、前端代码

1、changePw.html
<body>
<div class="message-content">
    <div class="message-top" style="height: 3rem">
        <div class="message-title" id="menuName">修改密码</div>
    </div>
    <div class="message-list">
            <div>
                <input type="hidden" id="userCode" th:value="${userCode}"/>
                <div style="margin-right: 10px">
                <div style="margin-top: 20px;">
                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;旧密码:
                    <input type="password" name="oldPassword" id="oldPassword" class="input"/>
                </div>
                <div style="margin-top: 20px;">
                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;新密码:
                    <input type="password"  name="newPassword" id="newPassword" class="input"/>
                </div>
                <div style="margin-top: 20px;">
                    确认新密码:
                    <input type="password"  name="reNewPassword" id="reNewPassword" class="input"/>
                </div>
                <div style="margin-top: 20px;text-align: center;">
                    <span class="errorMsg" style="color:red" id="errorMsg"></span>
                    <span class="successMsg" style="color:green" id="successMsg"></span>
                </div>
                <div style="margin-top: 40px;text-align: center;">
                    <input class="button" type="button" value="保存" id="save" style="margin-right:30px;width: 60px;  height:30px;"></input>
                    <input class="button" type="button" value="清空" id="clear" style="width: 60px;  height:30px;"></input>
                </div>
                </div>
            </div>
    </div>

</div>
</body>

2、changePw.js
$(function(){
   //清空按钮
   $("#clear").click(function(){
      $("#oldPassword").val("");
      $("#newPassword").val("");
      $("#reNewPassword").val("");
      $("#errorMsg").text("");
      $("#successMsg").text("");
      $("#save").attr("disabled",false);
      $("#save").attr("style","margin-right:30px;width: 60px;  height:30px;opacity:1");
      }
   );

   //保存按钮
   $("#save").click(function(){

      var oldPassword = $("#oldPassword").val();
      var newPassword = $("#newPassword").val();
      var reNewPassword = $("#reNewPassword").val();

      var password=/(?!^[0-9]+$)(?!^[A-z]+$)(?!^[_*&^%$#@!?=+<>]+$)(?!^[^A-z0-9]+$)^.{6,16}$/;
      if (oldPassword == "") {
         $("#errorMsg").text("旧密码不能为空!");
      }else if (newPassword == "") {
         $("#errorMsg").text("新密码不能为空!");
      }else if (reNewPassword == "") {
         $("#errorMsg").text("确认新密码不能为空!");
      }else if (newPassword != reNewPassword) {
         $("#errorMsg").text("新密码必须一致!");
      } else if (!password.exec(trim(newPassword))) {
         $("#errorMsg").text("密码必须为6-16位的字母、数字或符号任意两种的组合!");
      }else{

         var userCode = $("#userCode").val();

         $.ajax({
            url: "../user/savePwd",
            type: "POST",
            // contentType: "application/json; charset=utf-8",
            data: {
               userCode: userCode,
               oldPassword: oldPassword,
               newPassword: newPassword
            },
            dataType: 'text',
            success: function (data) {
               if(data == 1){
                  console.log("密码修改成功!");
                  $("#errorMsg").text("");
                  $("#successMsg").text("密码修改成功,请重新登陆!");
                  $("#save").attr("disabled",true);
                  $("#save").attr("style","margin-right:30px;width: 60px;  height:30px;opacity:0.5");
               } else if (data == 3){
                  $("#successMsg").text("");
                  $("#errorMsg").text("输入的旧密码错误!");
               } else if (data == 4){
                  $("#successMsg").text("");
                  $("#errorMsg").text("当前用户不存在,请重新登录!");
               } else {
                  $("#successMsg").text("");
                  $("#errorMsg").text("密码修改失败,请联系管理员!");
               }

            },
            error: function (msg) {
               $("#successMsg").text("");
               $("#errorMsg").text("密码修改失败,请联系管理员!");
            }
         })


      }
      }
   );
})

3、changePw.css
body {
   background-color: #f2f2f2;
   min-width:360px;
}

.message-content .message-top {
   height: 5rem;
   margin-left: 1rem;
}
.message-content .message-top .message-title {
   border-width: 0px;
   height: 3rem;
   font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
   font-weight: 700;
   font-style: normal;
   font-size: 16px;
   color: #434343;
   line-height: 3rem;
   text-indent: 1rem;
}
.button {
    background-color: rgba(0, 153, 204, 1);
    font: 14px "微软雅黑";
    color: #FFF;
    border: 0;
    height: 30px;
    width: 60px;
    left: 20px;
    border-radius: 5px;
    cursor: pointer;
}

三、后端代码

1、修改画面展示方法
/**
 * 修改密码
 * @param request
 * @param userCode
 * @param menuName
 * @return
 */
@RequestMapping(value = "/changePw")
public ModelAndView changePw(WebRequest request, String userCode, String menuName) {
    ModelAndView mav = new ModelAndView("userSetting/changePw");
    String socketId = userCode;
    if(!StringUtils.isEmpty(socketId) && socketId.split("\\|").length > 1){
        userCode = socketId.split("\\|")[1];
    }
    mav.addObject("socketId", socketId);

    //页面标题
    mav.addObject("menuName",menuName);
    mav.addObject("userCode",userCode);
    mav.addObject("systemTitle", systemTitle);

    return mav;
}

2、保存密码处理方法
@RequestMapping(value = "/savePwd",method = RequestMethod.POST)
@ResponseBody
public int savePwd(String userCode, String oldPassword, String newPassword) {

    int updateFlag = 0;

    String socketId = userCode;
    if(!StringUtils.isEmpty(socketId) && socketId.split("\\|").length > 1){
        userCode = socketId.split("\\|")[1];
    }

    MD5UtilController md5Util=new MD5UtilController();
    if(oldPassword == null || newPassword == null){
        return 0;
    }
    String old = md5Util.getMD5(oldPassword.getBytes());
    String newP = md5Util.getMD5(newPassword.getBytes());

    List<LoginDto> user=userService.selectUserByUserId(userCode);
    if(user != null && user.size() > 0){
        String pwd = user.get(0).getPassword();
        if(pwd != null && old.equals(pwd)){

            try {
                // 成功返回1
                updateFlag = userService.savePwd(userCode,newP);

            } catch (Exception e) {
                // 不成功返回0,数据库回滚
                updateFlag = 2;
            }
        }else{
            // 旧密码错误
            updateFlag = 3;
        }
    } else {
        // 用户不存在
        updateFlag = 4;
    }
    return updateFlag;
}

好的,以下是一个使用 jQuery 实现前端校验的示例代码。前端校验的主要目的是为了在用户提交数据到后端之前,对数据进行简单的格式检查和必填项检查。这样可以减轻后端的负担,同时也可以提高用户体验。 这个示例代码中,我们使用了 jQuery 的选择器来获取表单中的各个字段,然后使用 if 语句进行校验。如果校验不通过,就使用 jQuery 的 `alert()` 方法提示用户。如果校验通过,就发送 Ajax 请求到后端。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>jQuery前端校验示例</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> $(function () { $('#submit').click(function () { var username = $('#username').val(); var password = $('#password').val(); var sex = $('#sex').val(); var hobbies = $('input[name=hobby]:checked').val(); if (username == '') { alert('用户名不能为空'); return false; } if (password == '') { alert('密码不能为空'); return false; } else if (!/^\d{6}$/.test(password)) { alert('密码必须是6位数字'); return false; } if (sex == '') { alert('性别不能为空'); return false; } if (hobbies == undefined) { alert('兴趣爱好不能为空'); return false; } // 发送 Ajax 请求到后端 $.ajax({ url: '/register', type: 'post', data: { username: username, password: password, sex: sex, hobbies: hobbies }, success: function (res) { alert('注册成功'); }, error: function (xhr, status, error) { alert('注册失败:' + error); } }); return false; }); }); </script> </head> <body> <form> <div> <label>用户名:</label> <input type="text" name="username" id="username"> </div> <div> <label>密码:</label> <input type="password" name="password" id="password"> </div> <div> <label>性别:</label> <select name="sex" id="sex"> <option value=""></option> <option value="male">男</option> <option value="female">女</option> </select> </div> <div> <label>兴趣爱好:</label> <input type="checkbox" name="hobby" value="music">音乐 <input type="checkbox" name="hobby" value="film">电影 <input type="checkbox" name="hobby" value="sport">运动 </div> <div> <input type="submit" value="注册" id="submit"> </div> </form> </body> </html> ``` 对于后端的校验,您可以在 Java 中使用正则表达式来实现。以下是一个简单的 Java Servlet 示例代码,用于接收前端发送的 Ajax 请求,并对数据进行后端校验。如果校验不通过,可以向前端返回错误信息。 ```java import java.io.IOException; import java.io.PrintWriter; import java.util.regex.Pattern; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RegisterServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); String sex = request.getParameter("sex"); String hobbies = request.getParameter("hobbies"); // 后端校验 if ("zhangsan".equals(username)) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "用户名不合法"); return; } if (!Pattern.matches("\\d{6}", password)) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "密码不合法"); return; } if (!"male".equals(sex)) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "性别不合法"); return; } if (hobbies == null || hobbies.isEmpty()) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "兴趣爱好不能为空"); return; } // 打印注册信息 System.out.println("用户名:" + username); System.out.println("密码:" + password); System.out.println("性别:" + sex); System.out.println("兴趣爱好:" + hobbies); PrintWriter out = response.getWriter(); out.println("success"); out.close(); } } ``` 这里使用了 Java 的正则表达式来校验密码是否是6位数字。如果不是,就返回一个错误。当然,您可以根据实际需求修改正则表达式的规则。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值