高复用服务下的密码修改对象响应
1.在service层中存在一个UserServiceImpl类实现功能代码逻辑。在密码修改之前我们首先要通过checkVaild方法校验用户名或者Email邮箱是否存在。(同时checkVaild这个方法在注册功能中也有巨大的用处)
public ServerResponse<String> checkValid(String str,String type)
{
if(StringUtils.isNoneBlank(type))
{
if(Const.USERNAME.equals(type)) {
int resultCount = userMapper.checkUsername(str);//校验用户名是否存在
if(resultCount>0)
{
return ServerResponse.createByErrorMessage("用户名已存在");
}
}
if(Const.EMAIL.equals(type))
{
int resultCount=userMapper.checkEmail(str);//校验Email是否存在
if(resultCount>0)
{
return ServerResponse.createByErrorMessage("email已存在");
}
}
}
else
{
return ServerResponse.createByErrorMessage("参数错误");
}
return ServerResponse.createBySuccessMessage("校验成功");
}
userMapper.checkUsername和userMapper.checkEmail都是Mybatis生成的dao层方法,它们的UserMapper.xml如下:
<select id="checkUsername" resultType="int" parameterType="string" >
select count(1) from mmall_user
where username = #{username}
</select>
<select id="checkEmail" resultType="int" parameterType="string" >
select count(1) from mmall_user
where email = #{email}
</select>
这些sql语句实现了数据库的交互
2.要修改密码,必须要找出这个用户名对应的密码问题,所以要确定用户是否存在,要确定找回密码问题是否存在。所以就会使用到checkValid方法。
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.isNoneBlank(question))//再确定密码问题是否存在
{
return ServerResponse.createBySuccess(question);
}
return ServerResponse.createByErrorMessage("找回密码的问题是空的");
}
userMapper.selectQuestionByUsername的.xml文件如下所示:
<select id="selectQuestionByUsername" resultType="string" parameterType="string">
select
question
from mmall_user
where username = #{username}
</select>
3.检查回答是否正确,如果正确就可以改密码了
public ServerResponse<String> CheckAnswer(String username,String question,String answer)
{
int resultCount=userMapper.checkAnswer(username,question,answer);
if(resultCount>0)
{
//说明问题及问题答案是这个用户的,并且是正确的
String forgetToken= UUID.randomUUID().toString();//生成一个绝对不会重复的字符串
//forgetToken
TokenCache.setKey(TokenCache.TOKEN_PREFIX+username,forgetToken);
return ServerResponse.createBySuccess(forgetToken);//localCache.put(key,value),key是用户名,value是token信息,forgetToken是随机生成的绝不重复的字符串,想理解什么是token请看下面!
}
return ServerResponse.createByErrorMessage("问题的答案错误");
}
localCache是本地缓存的意思Java本地缓存的实现
4.忘记密码的情况下,重新设置密码。
很多人会想这个方法中的forgetToken是什么,在上面的方法中我们可以发现forgetToken其实就是生成的一个绝对不会重复的字符串,想要理解什么是token请看这篇博客
public ServerResponse<String> forgetResetPassword(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);//token是key对应的那串token的value值
if(StringUtils.isBlank(token))
{
return ServerResponse.createByErrorMessage("token无效或过期");
}
if(StringUtils.equals(forgetToken,token))//若两个token相等,则可以修改密码,并且保存这个新密码的md5码
{
String md5Password=MD5Util.MD5EncodeUtf8(passwordNew);
int rowCount=userMapper.updatePasswordByUsername(username, md5Password);
if(rowCount>0)
{
return ServerResponse.createBySuccessMessage("修改密码成功");
}
}
else//两个token不等的情况
{
return ServerResponse.createByErrorMessage("token错误,请重新获取重置密码的token");
}
return ServerResponse.createByErrorMessage("修改密码失败");
}
我会专门出一篇博客详解MD5Util类的所有实现,你们就可以理解这一段代码
String md5Password=MD5Util.MD5EncodeUtf8(passwordNew);是怎样实现的了
6.登录状态下重新设置密码(没有忘记密码的情况下,重新设置密码)。
public ServerResponse<String> resetPassword(String passwordOld,String passwordNew,User user)
{//登录状态下重置密码,首先需要检查旧密码是否正确。
int resultCount=userMapper.checkPassword(MD5Util.MD5EncodeUtf8(passwordOld),user.getId());
if(resultCount==0)
{
return ServerResponse.createByErrorMessage("旧密码错误");
}
user.setPassword(MD5Util.MD5EncodeUtf8(passwordNew));//旧密码正确就要将新密码转换成MD5码,赋值给user.Password
int updateCount=userMapper.updateByPrimaryKeySelective(user);//然后再更新所有用户信息,起到了修改密码的作用
if(updateCount>0)
{
return ServerResponse.createBySuccessMessage("密码更新成功");
}
return ServerResponse.createByErrorMessage("密码更新失败");
}
userMapper.updateByPrimaryKeySelective(user)的userMapper.xml文件代码如下所示
<update id="updateByPrimaryKeySelective" parameterType="com.mmall.pojo.User" >
update mmall_user
<set >
<if test="username != null" >
username = #{username,jdbcType=VARCHAR},
</if>
<if test="password != null" >
password = #{password,jdbcType=VARCHAR},
</if>
<if test="email != null" >
email = #{email,jdbcType=VARCHAR},
</if>
<if test="phone != null" >
phone = #{phone,jdbcType=VARCHAR},
</if>
<if test="question != null" >
question = #{question,jdbcType=VARCHAR},
</if>
<if test="answer != null" >
answer = #{answer,jdbcType=VARCHAR},
</if>
<if test="role != null" >
role = #{role,jdbcType=INTEGER},
</if>
<if test="createTime != null" >
create_time = #{createTime,jdbcType=TIMESTAMP},
</if>
<if test="updateTime != null" >
update_time = now(),
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
会发现所有的信息包括时间点都发生了更新。