|
|
package com.wsk.controller;
|
|
|
|
|
|
import com.wsk.pojo.UserInformation;
|
|
|
import com.wsk.pojo.UserPassword;
|
|
|
import com.wsk.response.BaseResponse;
|
|
|
import com.wsk.service.UserInformationService;
|
|
|
import com.wsk.service.UserPasswordService;
|
|
|
import com.wsk.tool.StringUtils;
|
|
|
import org.springframework.stereotype.Controller;
|
|
|
import org.springframework.ui.Model;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
* Created by wsk1103 on 2017/5/9.
|
|
|
* ForgetController类,主要用于处理用户忘记密码相关的业务逻辑,
|
|
|
* 例如验证验证码、更新密码等操作,是Spring MVC框架中的一个控制器类。
|
|
|
*/
|
|
|
@RestController
|
|
|
// @RestController注解,结合了@Controller和@ResponseBody的功能,
|
|
|
// 意味着该类中的方法返回值会直接作为响应体返回给客户端(通常用于返回JSON等数据格式),而不是跳转视图。
|
|
|
public class ForgetController {
|
|
|
|
|
|
@Resource
|
|
|
// @Resource注解用于依赖注入,这里会将Spring容器中管理的UserPasswordService类型的Bean注入到当前类中,
|
|
|
// 以便后续调用该服务层提供的与用户密码相关的业务方法。
|
|
|
private UserPasswordService userPasswordService;
|
|
|
@Resource
|
|
|
// 同理,注入UserInformationService类型的Bean,用于调用和用户信息相关的业务方法。
|
|
|
private UserInformationService userInformationService;
|
|
|
|
|
|
/**
|
|
|
* 处理验证手机号验证码相关的请求方法。
|
|
|
* 支持POST和GET请求方式,用于验证传入的验证码和token是否有效,并根据验证结果返回相应信息。
|
|
|
*
|
|
|
* @param request HttpServletRequest对象,用于获取请求相关的信息,如请求参数、会话等。
|
|
|
* @param model Spring MVC中的Model对象,可用于向视图传递数据(此处该类是@RestController,一般不用于视图传递,但保留参数形式)。
|
|
|
* @param code 从请求中获取的验证码参数。
|
|
|
* @param token 从请求中获取的token参数,用于验证请求的合法性等。
|
|
|
* @return 返回一个Map,其中包含验证结果("result"键对应的整数值,1表示验证通过,0表示验证失败)。
|
|
|
*/
|
|
|
@RequestMapping(value = "checkCode.do", method = {RequestMethod.POST, RequestMethod.GET})
|
|
|
public Map checkPhone(HttpServletRequest request, Model model,
|
|
|
@RequestParam String code, @RequestParam String token) {
|
|
|
Map<String, Integer> map = new HashMap<>();
|
|
|
// 从请求中获取名为"name"的参数值
|
|
|
String name = request.getParameter("name");
|
|
|
// 判断name是否不为空(利用StringUtils工具类的方法来判断),如果不为空,则将其存入会话中。
|
|
|
if (!StringUtils.getInstance().isNullOrEmpty(name)) {
|
|
|
request.getSession().setAttribute("name", name);
|
|
|
}
|
|
|
// 从会话中获取名为"token"的属性值,用于后续验证。
|
|
|
String checkCodeToken = (String) request.getSession().getAttribute("token");
|
|
|
// 如果获取到的会话中的token为空或者与传入的token不一致,则验证失败,将结果设置为0并返回。
|
|
|
if (StringUtils.getInstance().isNullOrEmpty(checkCodeToken) ||!checkCodeToken.equals(token)) {
|
|
|
map.put("result", 0);
|
|
|
return map;
|
|
|
}
|
|
|
// 调用checkCodePhone方法验证验证码是否正确,如果不正确,验证失败,将结果设置为0并返回。
|
|
|
if (!checkCodePhone(code, request)) {
|
|
|
map.put("result", 0);
|
|
|
return map;
|
|
|
}
|
|
|
// 验证通过,将结果设置为1并返回。
|
|
|
map.put("result", 1);
|
|
|
return map;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 用于更新用户密码的方法。
|
|
|
* 根据传入的新密码和token等信息,进行密码更新操作,并返回相应的操作结果响应(通过BaseResponse封装)。
|
|
|
*
|
|
|
* @param request HttpServletRequest对象,用于获取请求相关的信息以及操作会话等。
|
|
|
* @param model Spring MVC中的Model对象(此处一般不用于视图传递,但保留参数形式)。
|
|
|
* @param password 从请求中获取的新密码参数。
|
|
|
* @param token 从请求中获取的token参数,用于防止重复提交等验证。
|
|
|
* @return 返回BaseResponse对象,表示密码更新操作的结果,成功返回success,失败返回fail。
|
|
|
*/
|
|
|
@RequestMapping("updatePassword.do")
|
|
|
public BaseResponse updatePassword(HttpServletRequest request, Model model,
|
|
|
@RequestParam String password, @RequestParam String token) {
|
|
|
// 从会话中获取名为"token"的属性值,用于验证是否重复提交(和传入的token对比)。
|
|
|
String updatePasswordToken = (String) request.getSession().getAttribute("token");
|
|
|
// 如果获取到的会话中的token为空或者与传入的token不一致,则认为是重复提交或非法请求,直接返回失败响应。
|
|
|
if (StringUtils.getInstance().isNullOrEmpty(updatePasswordToken) ||!updatePasswordToken.equals(token)) {
|
|
|
return BaseResponse.fail();
|
|
|
}
|
|
|
// 从会话中获取存储的真实手机号(假设之前已存入会话中)。
|
|
|
String realPhone = (String) request.getSession().getAttribute("phone");
|
|
|
UserPassword userPassword = new UserPassword();
|
|
|
// 使用StringUtils工具类的方法对传入的密码进行MD5加密处理,得到加密后的新密码。
|
|
|
String newPassword = StringUtils.getInstance().getMD5(password);
|
|
|
int uid;
|
|
|
try {
|
|
|
// 通过用户信息服务,根据手机号查询对应的用户ID,如果查询到的ID为0,表示未找到对应用户,返回失败响应。
|
|
|
uid = userInformationService.selectIdByPhone(realPhone);
|
|
|
if (uid == 0) {
|
|
|
return BaseResponse.fail();
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
return BaseResponse.fail();
|
|
|
}
|
|
|
// 通过用户密码服务,根据用户ID查询对应的用户密码记录,并获取其ID。
|
|
|
int id = userPasswordService.selectByUid(uid).getId();
|
|
|
userPassword.setId(id);
|
|
|
userPassword.setUid(uid);
|
|
|
// 设置密码修改时间为当前时间。
|
|
|
userPassword.setModified(new Date());
|
|
|
userPassword.setPassword(newPassword);
|
|
|
int result;
|
|
|
try {
|
|
|
// 调用用户密码服务的方法,根据主键有选择地更新用户密码记录(只更新传入的非空字段对应的属性)。
|
|
|
result = userPasswordService.updateByPrimaryKeySelective(userPassword);
|
|
|
} catch (Exception e) {
|
|
|
return BaseResponse.fail();
|
|
|
}
|
|
|
// 如果更新操作影响的行数不等于1(即更新失败),返回失败响应。
|
|
|
if (result!= 1) {
|
|
|
return BaseResponse.fail();
|
|
|
}
|
|
|
// 更新成功后,根据用户ID查询用户信息,并将其存入会话中,方便后续使用。
|
|
|
UserInformation userInformation = userInformationService.selectByPrimaryKey(uid);
|
|
|
request.getSession().setAttribute("userInformation", userInformation);
|
|
|
return BaseResponse.success();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 私有方法,用于检查传入的手机号验证码是否正确。
|
|
|
* 这里目前写死了正确的验证码为"12251103",实际应用中应该从数据库等正确的数据源获取进行对比验证。
|
|
|
*
|
|
|
* @param codePhone 传入的要验证的手机号验证码。
|
|
|
* @param request HttpServletRequest对象(此处未用到,可根据实际情况调整是否需要该参数)。
|
|
|
* @return 返回布尔值,true表示验证码正确,false表示验证码错误。
|
|
|
*/
|
|
|
// check the phone`s code
|
|
|
private boolean checkCodePhone(String codePhone, HttpServletRequest request) {
|
|
|
String trueCodePhone = "12251103";
|
|
|
return codePhone.equals(trueCodePhone);
|
|
|
}
|
|
|
} |