You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Used-Trading-Platform.txt/src/main/java/com/wsk/controller/ForgetController.java

146 lines
8.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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