业务逻辑:用户忘记登录密码,然后根据用户用户名找到用户之前设置的问题,用户填写问题答案,若答案正确用户即可重置密码,若回答问题错误,则提示回答错误,不允许重置密码。
1、根据用户的用户名后台查找出用户设置的问题:controller
:
@RequestMapping(value = "forget_get_question.do",method = RequestMethod.POST)
@ResponseBody
public ServerResponse<String> forgetGetQuestion(String username){
return iUserService.selectQuestion(username);
}
server
:
ServerResponse selectQuestion(String username);
serverImpl
:
首先我们先根据用户提供的用户名看用户名是否存在,如果用户名不存在。则返回客户端显示用户不存在,不进行下一步操作,如果用户名存在,则再查询用户设置的问题
//忘记密码
public ServerResponse selectQuestion(String username){
ServerResponse validResponse=this.checkValid(username,Const.USERNAME);
if(validResponse.isSuccess()){
//用户不存在
return ServerResponse.createByErrorMessage("用户不存在");
}
String question =userMapper.selectQuestionByUsername(username);
if(StringUtils.isNotBlank(question)){
return ServerResponse.createBySuccess(question);
}
return ServerResponse.createByErrorMessage("找回密码的问题是空");
}
Mapper
:
String selectQuestionByUsername(String username);
Mapper.xml
:
<!--找回密码-->
<select id="selectQuestionByUsername" resultType="string" parameterType="string">
select
question
from mmall_user
where username=#{username}
</select>
2、用户提交问题并且校验:controller
:
//提交问题答案
@RequestMapping(value = "forget_check_answer.do",method = RequestMethod.POST)
@ResponseBody
public ServerResponse<String> forgetCheckAnswer(String username,String question,String answer){
return iUserService.CheckAnswer(username,question,answer);
}
server
:
//校验问题的回答
ServerResponse<String> CheckAnswer(String username,String question,String answer);
serverImpl
:
/校验回答是否正确
public ServerResponse<String> CheckAnswer(String username,String question,String answer){
int resultCount=userMapper.checkAnwser(username,question,answer);
if(resultCount>0){
//说明问题及问题答案是这个用户的,并且回答正确
String forgetToken= UUID.randomUUID().toString();
TokenCache.setKey(TokenCache.TOKEN_PREFIX+username,forgetToken);
return ServerResponse.createBySuccess(forgetToken);
}
//说明问题是这个用户,但是回答错误
return ServerResponse.createByErrorMessage("回答错误");
}
Mapper
:
//校验用户提交问题的答案是否正确
int checkAnwser(@Param("username") String username, @Param("question") String question, @Param("answer") String answer);
Mapper.xml
:
<!--提交问题答案-->
<select id="checkAnwser" resultType="int" parameterType="map">
select
count(1)
from
mmall_user
where username=#{username}
and question=#{question}
and answer=#{answer}
</select>
3、用户在回答问题正确的前提下重置密码:controller
:
//忘记密码中重置密码
@RequestMapping(value = "forget_rest_password.do",method = RequestMethod.POST)
@ResponseBody
public ServerResponse<String> forgetRestPassword(String username,String passwordNew,String forgetToken){
return iUserService.forgetRestPassword(username,passwordNew,forgetToken);
}
server
:
//忘记密码状态下重置密码
ServerResponse<String> forgetRestPassword(String username,String passwordNew,String forgetToken);
serverImpl
:
//忘记密码状态下重置密码
public ServerResponse<String> forgetRestPassword(String username,String passwordNew,String forgetToken){
if(StringUtils.isBlank(forgetToken)){
return ServerResponse.createByErrorMessage("参数错误,token需要传递");
}
ServerResponse validResponse=this.checkValid(username,Const.USERNAME);
if(validResponse.isSuccess()){
//用户不存在
return ServerResponse.createByErrorMessage("用户不存在");
}
String token=TokenCache.getKey(TokenCache.TOKEN_PREFIX+username);
if(StringUtils.isBlank(token)){
return ServerResponse.createByErrorMessage("token无效或者过期");
}
if(StringUtils.equals(forgetToken,token)){
String md5Password=MD5Util.MD5EncodeUtf8(passwordNew);
int rowCount=userMapper.updatePasswordByUsername(username,md5Password);
if(rowCount>0){
return ServerResponse.createBySuccessMessage("修改密码成功");
}
}else {
return ServerResponse.createByErrorMessage("token错误,请重新获取重置密码的token");
}
return ServerResponse.createByErrorMessage("修改密码失败");
}
Mapper
:
//忘记密码状态下重置密码
int updatePasswordByUsername(@Param("username") String username, @Param("passwordNew") String passwordNew);
Mapper.xml
:
<!-- //忘记密码状态下重置密码-->
<update id="updatePasswordByUsername" parameterType="map" >
update mmall_user
set password = #{passwordNew},update_time=now()
where username = #{username}
</update>
接口测试:
1、
查询用户名是否有效
2、查询出用户设置的问题以及校验用户回答的问答:
Ⅰ回答正确:
Ⅱ回答错误,返回回答错误:
3、修改密码: