|
|
package com.controller.frontweb;
|
|
|
|
|
|
import com.dao.FrontWebDao;
|
|
|
|
|
|
import javax.servlet.ServletException;
|
|
|
import javax.servlet.annotation.WebServlet;
|
|
|
import javax.servlet.http.HttpServlet;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
import java.io.IOException;
|
|
|
|
|
|
/**
|
|
|
* 处理部门管理员忘记密码重置请求的Servlet
|
|
|
* 验证两次输入的新密码是否一致并更新数据库
|
|
|
*/
|
|
|
@WebServlet("/DeptAdmForgetPswServlet")
|
|
|
public class DeptAdmForgetPswServlet extends HttpServlet {
|
|
|
@Override
|
|
|
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
|
|
// 设置请求的字符编码为UTF-8,确保能正确处理请求中的中文字符等,防止乱码
|
|
|
req.setCharacterEncoding("utf-8");
|
|
|
// 设置响应的字符编码为UTF-8,保证响应内容在传输过程中字符的正确性,防止乱码
|
|
|
resp.setCharacterEncoding("utf-8");
|
|
|
// 设置响应的内容类型为HTML格式,且字符编码为UTF-8,告知客户端如何解析响应内容
|
|
|
resp.setContentType("text/html;charset=utf-8");
|
|
|
|
|
|
// 从HTTP请求的参数中获取名为"adno"的参数值,该值代表管理员编号(用户输入的需要重置密码的账号)
|
|
|
String adno = req.getParameter("adno");
|
|
|
|
|
|
// 从HTTP请求的参数中获取名为"adpsw"的参数值,该值代表用户输入的新密码
|
|
|
String adpsw = req.getParameter("adpsw");
|
|
|
// 从HTTP请求的参数中获取名为"adpsw1"的参数值,该值代表用户输入的用于确认的新密码
|
|
|
String adpsw1 = req.getParameter("adpsw1");
|
|
|
|
|
|
// 进行输入验证,检查获取到的管理员编号、新密码、确认密码这三个参数是否有任何一个为null
|
|
|
if (adno == null || adpsw == null || adpsw1 == null) {
|
|
|
// 如果存在参数为null的情况,通过响应向客户端发送一段JavaScript代码
|
|
|
// 该代码会弹出一个提示框,显示“参数不能为空!”
|
|
|
// 并将页面重定向到密码重置页面(路径为/view/frontweb/deptadmforgetpsw.jsp)
|
|
|
resp.getWriter().write("<script>alert('参数不能为空!'); window.location='" + req.getContextPath() + "/view/frontweb/deptadmforgetpsw.jsp';</script>");
|
|
|
// 终止当前doGet方法的执行,不再继续后续操作
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 判断用户输入的新密码和确认密码是否相等
|
|
|
if (adpsw.equals(adpsw1)){
|
|
|
// 如果相等,则进行密码强度验证,调用isPasswordValid方法来检查密码是否符合要求
|
|
|
if (!isPasswordValid(adpsw)) {
|
|
|
// 如果密码强度不符合要求(例如长度不足8位或不包含字母和数字)
|
|
|
// 通过响应向客户端发送一段JavaScript代码
|
|
|
// 该代码会弹出一个提示框,显示“密码强度不足!至少8位,包含字母和数字”
|
|
|
// 并将页面重定向到密码重置页面(路径为/view/frontweb/deptadmforgetpsw.jsp)
|
|
|
resp.getWriter().write("<script>alert('密码强度不足!至少8位,包含字母和数字'); window.location='" + req.getContextPath() + "/view/frontweb/deptadmforgetpsw.jsp';</script>");
|
|
|
// 终止当前doGet方法的执行,不再继续后续操作
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 构造一条SQL更新语句,用于更新数据库中admin表的记录
|
|
|
// 将指定管理员编号(adno)对应的密码(adpsw)进行更新
|
|
|
String sql = "update admin set adpsw = ? where adno = ?";
|
|
|
// 创建一个包含SQL语句参数的对象数组,第一个参数是新密码,第二个参数是管理员编号
|
|
|
Object[] objects = {adpsw, adno};
|
|
|
|
|
|
// 调用isAdminExists方法来验证要重置密码的管理员账号是否存在于数据库中
|
|
|
if (!isAdminExists(adno)) {
|
|
|
// 如果管理员账号不存在,通过响应向客户端发送一段JavaScript代码
|
|
|
// 该代码会弹出一个提示框,显示“管理员账号不存在!”
|
|
|
// 并将页面重定向到密码重置页面(路径为/view/frontweb/deptadmforgetpsw.jsp)
|
|
|
resp.getWriter().write("<script>alert('管理员账号不存在!'); window.location='" + req.getContextPath() + "/view/frontweb/deptadmforgetpsw.jsp';</script>");
|
|
|
// 终止当前doGet方法的执行,不再继续后续操作
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 调用FrontWebDao类中的executeUpdate方法执行SQL更新语句
|
|
|
// 该方法会返回受影响的行数,即成功更新的记录数量,将其存储在num变量中
|
|
|
int num = FrontWebDao.executeUpdate(sql, objects);
|
|
|
|
|
|
// 判断受影响的行数是否大于0,若大于0表示密码更新操作成功
|
|
|
if (num > 0){
|
|
|
// 如果更新成功,通过响应向客户端发送一段JavaScript代码
|
|
|
// 该代码会弹出一个提示框,显示“修改密码成功!请登录!”
|
|
|
// 并将页面重定向到部门管理员登录页面(路径为/view/frontweb/deptadmlogin.jsp),同时关闭当前窗口
|
|
|
resp.getWriter().write("<script>alert('修改密码成功!请登录!'); window.location='" + req.getContextPath() + "/view/frontweb/deptadmlogin.jsp';" + "window.close();</script>");
|
|
|
}else {
|
|
|
// 如果受影响的行数不大于0,说明密码更新操作失败
|
|
|
// 通过响应向客户端发送一段JavaScript代码
|
|
|
// 该代码会弹出一个提示框,显示“修改密码失败!请联系管理员”
|
|
|
// 并将页面重定向到密码重置页面(路径为/view/frontweb/deptadmforgetpsw.jsp)
|
|
|
resp.getWriter().write("<script>alert('修改密码失败!请联系管理员'); window.location='" + req.getContextPath() + "/view/frontweb/deptadmforgetpsw.jsp';</script>");
|
|
|
}
|
|
|
}else {
|
|
|
// 如果用户输入的新密码和确认密码不相等
|
|
|
// 通过响应向客户端发送一段JavaScript代码
|
|
|
// 该代码会弹出一个提示框,显示“两次密码不一样!请重新输入密码!”
|
|
|
// 并将页面重定向到密码重置页面(路径为/view/frontweb/deptadmforgetpsw.jsp),同时关闭当前窗口
|
|
|
resp.getWriter().write("<script>alert('两次密码不一样!请重新输入密码!'); window.location='" + req.getContextPath() + "/view/frontweb/deptadmforgetpsw.jsp';" + "window.close();</script>");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
|
|
// 对于接收到的POST请求,直接调用doGet方法来处理,复用doGet方法中的业务逻辑
|
|
|
this.doGet(req, resp);
|
|
|
}
|
|
|
|
|
|
// 私有方法,用于验证管理员账号是否存在于数据库中
|
|
|
private boolean isAdminExists(String adno) {
|
|
|
// 构造一条SQL查询语句,用于统计admin表中指定管理员编号(adno)的记录数量
|
|
|
String sql = "select count(*) as num from admin where adno = ?";
|
|
|
// 创建一个包含SQL语句参数的对象数组,参数为管理员编号
|
|
|
Object[] params = {adno};
|
|
|
// 调用FrontWebDao类中的findTotalCount方法执行SQL查询语句
|
|
|
// 该方法会返回查询结果中记录的数量,将其存储在count变量中
|
|
|
int count = FrontWebDao.findTotalCount(sql, params);
|
|
|
// 如果记录数量大于0,说明管理员账号存在,返回true;否则返回false
|
|
|
return count > 0;
|
|
|
}
|
|
|
|
|
|
// 私有方法,用于验证密码强度是否符合要求
|
|
|
private boolean isPasswordValid(String password) {
|
|
|
// 使用正则表达式进行匹配,判断密码是否至少8位,并且同时包含字母和数字
|
|
|
// 如果匹配成功,说明密码强度符合要求,返回true;否则返回false
|
|
|
return password.matches("^(?=.*[A-Za-z])(?=.*\\d).{8,}$");
|
|
|
}
|
|
|
} |