高复用服务下的密码修改

本文详细解析了高复用服务架构下密码修改的业务流程,涵盖用户名和Email校验、密码问题找回、密码重置等功能,通过Mybatis实现数据库交互,利用Java本地缓存提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高复用服务下的密码修改对象响应

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>

会发现所有的信息包括时间点都发生了更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值