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 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); } }