|
|
|
@ -20,80 +20,135 @@ import java.util.Map;
|
|
|
|
|
* Created by wsk1103 on 2017/5/9.
|
|
|
|
|
*/
|
|
|
|
|
@RestController
|
|
|
|
|
package //这里应该是对应的包名,原代码未显示完整,假设为对应的业务包名;
|
|
|
|
|
|
|
|
|
|
import //导入相关的类库,原代码未显示完整,以下是按使用情况推测的常见导入示例
|
|
|
|
|
javax.servlet.http.HttpServletRequest;
|
|
|
|
|
org.springframework.web.bind.annotation.RequestMapping;
|
|
|
|
|
org.springframework.web.bind.annotation.RequestMethod;
|
|
|
|
|
org.springframework.web.bind.annotation.RequestParam;
|
|
|
|
|
org.springframework.web.servlet.Model;
|
|
|
|
|
java.util.HashMap;
|
|
|
|
|
java.util.Map;
|
|
|
|
|
java.util.Date;
|
|
|
|
|
//假设存在对应的自定义工具类、实体类、响应类等的导入,例如
|
|
|
|
|
import com.example.utils.StringUtils;
|
|
|
|
|
import com.example.entity.UserPassword;
|
|
|
|
|
import com.example.entity.UserInformation;
|
|
|
|
|
import com.example.service.UserPasswordService;
|
|
|
|
|
import com.example.service.UserInformationService;
|
|
|
|
|
import com.example.response.BaseResponse;
|
|
|
|
|
|
|
|
|
|
//定义ForgetController类,通常用于处理与忘记密码相关的业务逻辑,比如验证手机号验证码、更新密码等操作
|
|
|
|
|
//在Spring MVC框架中,一般作为一个控制器类来接收和处理对应的HTTP请求
|
|
|
|
|
public class ForgetController {
|
|
|
|
|
|
|
|
|
|
// 使用@Resource注解注入UserPasswordService,用于处理用户密码相关业务逻辑,由Spring框架自动装配
|
|
|
|
|
// 例如密码的查询、更新等操作会依赖这个服务类
|
|
|
|
|
@Resource
|
|
|
|
|
private UserPasswordService userPasswordService;
|
|
|
|
|
// 使用@Resource注解注入UserInformationService,用于处理用户信息相关业务逻辑,由Spring框架自动装配
|
|
|
|
|
// 像通过手机号查询用户ID等操作会通过这个服务类来完成
|
|
|
|
|
@Resource
|
|
|
|
|
private UserInformationService userInformationService;
|
|
|
|
|
//test1
|
|
|
|
|
|
|
|
|
|
// 处理验证手机号验证码的请求,该方法可以接收POST和GET两种请求方式,访问路径为"checkCode.do"
|
|
|
|
|
// 用于验证用户输入的验证码是否正确以及相关的验证逻辑,根据验证结果返回包含验证结果状态的Map
|
|
|
|
|
@RequestMapping(value = "checkCode.do", method = {RequestMethod.POST, RequestMethod.GET})
|
|
|
|
|
public Map checkPhone(HttpServletRequest request, Model model,
|
|
|
|
|
@RequestParam String code, @RequestParam String token) {
|
|
|
|
|
// 创建一个Map对象,用于存储验证结果相关信息,这里以"result"作为键,存储验证结果的整数值(0表示失败,1表示成功等情况)
|
|
|
|
|
Map<String, Integer> map = new HashMap<>();
|
|
|
|
|
// 从HttpServletRequest中获取名为"name"的参数值,可能是用户相关的名称信息(具体看业务逻辑)
|
|
|
|
|
String name = request.getParameter("name");
|
|
|
|
|
// 如果获取到的"name"参数值不为空,将其设置到HttpServletRequest的session中,方便后续在不同请求间共享这个数据
|
|
|
|
|
if (!StringUtils.getInstance().isNullOrEmpty(name)) {
|
|
|
|
|
request.getSession().setAttribute("name", name);
|
|
|
|
|
}
|
|
|
|
|
// 从HttpServletRequest的session中获取名为"token"的属性值,这个token可能用于防止重复提交或者验证请求的合法性等操作(具体看业务设计)
|
|
|
|
|
String checkCodeToken = (String) request.getSession().getAttribute("token");
|
|
|
|
|
if (StringUtils.getInstance().isNullOrEmpty(checkCodeToken) || !checkCodeToken.equals(token)) {
|
|
|
|
|
// 如果获取到的token为空或者与传入的token不一致,说明请求可能不合法或者存在重复提交等问题,将验证结果设置为0(表示失败),并返回这个包含验证结果的Map
|
|
|
|
|
if (StringUtils.getInstance().isNullOrEmpty(checkCodeToken) ||!checkCodeToken.equals(token)) {
|
|
|
|
|
map.put("result", 0);
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
//验证码错误
|
|
|
|
|
// 调用checkCodePhone方法验证用户输入的验证码(code参数)是否正确,这里传入用户输入的验证码和HttpServletRequest对象
|
|
|
|
|
// 如果验证失败(即验证码不正确),将验证结果设置为0(表示失败),并返回这个包含验证结果的Map
|
|
|
|
|
if (!checkCodePhone(code, request)) {
|
|
|
|
|
map.put("result", 0);
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
// 如果前面的验证都通过,说明验证码正确,将验证结果设置为1(表示成功),并返回这个包含验证结果的Map
|
|
|
|
|
map.put("result", 1);
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//更新密码
|
|
|
|
|
// 处理更新密码的请求,访问路径为"updatePassword.do",用于更新用户的登录密码
|
|
|
|
|
// 根据传入的新密码以及相关验证信息进行密码更新操作,更新成功返回成功响应,失败则返回失败响应
|
|
|
|
|
@RequestMapping("updatePassword.do")
|
|
|
|
|
public BaseResponse updatePassword(HttpServletRequest request, Model model,
|
|
|
|
|
@RequestParam String password, @RequestParam String token) {
|
|
|
|
|
//防止重复提交
|
|
|
|
|
// 防止重复提交,从HttpServletRequest的session中获取名为"token"的属性值,这个token用于验证当前请求是否重复
|
|
|
|
|
// 如果获取到的token为空或者与传入的token不一致,说明可能是重复提交的请求,直接返回表示失败的BaseResponse对象
|
|
|
|
|
String updatePasswordToken = (String) request.getSession().getAttribute("token");
|
|
|
|
|
if (StringUtils.getInstance().isNullOrEmpty(updatePasswordToken) || !updatePasswordToken.equals(token)) {
|
|
|
|
|
if (StringUtils.getInstance().isNullOrEmpty(updatePasswordToken) ||!updatePasswordToken.equals(token)) {
|
|
|
|
|
return BaseResponse.fail();
|
|
|
|
|
}
|
|
|
|
|
// 从HttpServletRequest的session中获取名为"phone"的属性值,这个应该是用户的手机号信息(具体看业务逻辑中是如何设置到session里的)
|
|
|
|
|
String realPhone = (String) request.getSession().getAttribute("phone");
|
|
|
|
|
// 创建一个UserPassword对象,用于封装要更新的密码相关信息,后续会设置各种属性并通过服务层进行密码更新操作
|
|
|
|
|
UserPassword userPassword = new UserPassword();
|
|
|
|
|
// 对用户传入的新密码进行MD5加密(通过StringUtils工具类的实例方法),提高密码安全性,然后将加密后的密码设置到UserPassword对象中
|
|
|
|
|
String newPassword = StringUtils.getInstance().getMD5(password);
|
|
|
|
|
int uid;
|
|
|
|
|
try {
|
|
|
|
|
// 调用userInformationService的selectIdByPhone方法,通过用户的手机号(realPhone)查询对应的用户ID,用于关联密码信息等后续操作
|
|
|
|
|
uid = userInformationService.selectIdByPhone(realPhone);
|
|
|
|
|
// 如果查询到的用户ID为0,说明可能没有找到对应的用户,直接返回表示失败的BaseResponse对象
|
|
|
|
|
if (uid == 0) {
|
|
|
|
|
return BaseResponse.fail();
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
// 如果在查询用户ID的过程中出现异常,打印异常栈信息方便排查问题,然后返回表示失败的BaseResponse对象
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return BaseResponse.fail();
|
|
|
|
|
}
|
|
|
|
|
// 通过userPasswordService的selectByUid方法,根据用户ID(uid)查询对应的用户密码记录,获取其ID(可能用于更新操作的主键等相关逻辑)
|
|
|
|
|
int id = userPasswordService.selectByUid(uid).getId();
|
|
|
|
|
// 设置UserPassword对象的ID属性,通常用于确定要更新的具体密码记录(结合数据库的主键等概念)
|
|
|
|
|
userPassword.setId(id);
|
|
|
|
|
// 设置UserPassword对象的用户ID属性,关联到对应的用户
|
|
|
|
|
userPassword.setUid(uid);
|
|
|
|
|
// 设置UserPassword对象的修改时间为当前时间,用于记录密码更新的时间等业务逻辑
|
|
|
|
|
userPassword.setModified(new Date());
|
|
|
|
|
// 设置UserPassword对象的密码为加密后的新密码
|
|
|
|
|
userPassword.setPassword(newPassword);
|
|
|
|
|
int result;
|
|
|
|
|
try {
|
|
|
|
|
// 调用userPasswordService的updateByPrimaryKeySelective方法,根据设置好的UserPassword对象信息更新用户密码,将更新结果保存到result变量中
|
|
|
|
|
result = userPasswordService.updateByPrimaryKeySelective(userPassword);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
// 如果在更新密码过程中出现异常,直接返回表示失败的BaseResponse对象
|
|
|
|
|
return BaseResponse.fail();
|
|
|
|
|
}
|
|
|
|
|
//更新失败
|
|
|
|
|
if (result != 1) {
|
|
|
|
|
// 如果更新结果不等于1(通常1表示更新成功,具体看服务层实现逻辑),说明密码更新失败,返回表示失败的BaseResponse对象
|
|
|
|
|
if (result!= 1) {
|
|
|
|
|
return BaseResponse.fail();
|
|
|
|
|
}
|
|
|
|
|
// 如果密码更新成功,通过userInformationService的selectByPrimaryKey方法根据用户ID(uid)查询对应的用户信息记录
|
|
|
|
|
UserInformation userInformation = userInformationService.selectByPrimaryKey(uid);
|
|
|
|
|
// 将更新后的用户信息重新设置到HttpServletRequest的session中,方便后续其他操作获取最新的用户信息
|
|
|
|
|
request.getSession().setAttribute("userInformation", userInformation);
|
|
|
|
|
// 返回表示成功的BaseResponse对象,代表密码更新操作成功完成
|
|
|
|
|
return BaseResponse.success();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//check the phone`s code
|
|
|
|
|
// 私有方法,用于检查用户输入的手机号验证码是否正确
|
|
|
|
|
// 参数codePhone是用户输入的验证码,request是HttpServletRequest对象,可能在更复杂的验证逻辑中会用到请求相关信息(目前代码中只是简单对比固定值)
|
|
|
|
|
private boolean checkCodePhone(String codePhone, HttpServletRequest request) {
|
|
|
|
|
// 定义一个固定的正确验证码值(这里只是示例,实际业务中应该是从数据库、缓存或者短信服务等获取正确验证码),目前设置为"12251103"
|
|
|
|
|
String trueCodePhone = "12251103";
|
|
|
|
|
// 通过比较用户输入的验证码(codePhone)和正确的验证码(trueCodePhone)是否相等,返回验证结果(相等则返回true表示正确,不相等返回false表示错误)
|
|
|
|
|
return codePhone.equals(trueCodePhone);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|