请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

修改密码失败,一直提示token失效或错误

[20:20:46.809][DEBUG][org.mybatis.spring.SqlSessionUtils][http-bio-8088-exec-8] Creating a new SqlSession
[20:20:46.820][DEBUG][org.mybatis.spring.SqlSessionUtils][http-bio-8088-exec-8] SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1058389a] was not registered for synchronization because synchronization is not active
[20:20:47.126][DEBUG][o.m.s.t.SpringManagedTransaction][http-bio-8088-exec-8] JDBC Connection [jdbc:mysql://localhost:3306/mmall_learning?characterEncoding=utf-8, UserName=root@localhost, MySQL-AB JDBC Driver] will not be managed by Spring
[20:20:47.130][DEBUG][com.mmall.dao.UserMapper.checkUsername][http-bio-8088-exec-8] ==> Preparing: select count(1) from mmall_user where username = ?
[20:20:47.148][DEBUG][com.mmall.dao.UserMapper.checkUsername][http-bio-8088-exec-8] > Parameters: geely(String)
[20:20:47.159][DEBUG][com.mmall.dao.UserMapper.checkUsername][http-bio-8088-exec-8] < Total: 1
[20:20:47.161][DEBUG][org.mybatis.spring.SqlSessionUtils][http-bio-8088-exec-8] Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1058389a]

检查了很多遍,实在找不出问题在哪里了。。。

正在回答

4回答

同学,你好,我是geely老师的助教。

请你提供修改密码的代码,方便我尽快定位问题。


1 回复 有任何疑惑可以回复我~
慕后端6535789 2019-08-17 15:31:52

这个问题解决了吗,怎么解决的

0 回复 有任何疑惑可以回复我~
提问者 黑色天空8655 2018-12-31 22:51:27
public class TokenCache {

    private static Logger logger = LoggerFactory.getLogger(TokenCache.class);

    public static final String TOKEN_PREFIX = "token_";

    private static LoadingCache<String,String> localCache = CacheBuilder.newBuilder().initialCapacity(1000).maximumSize(10000).expireAfterAccess(12, TimeUnit.HOURS)
            .build(new CacheLoader<String, String>() {
                @Override
                public String load(String s) throws Exception {
                    return "null";
                }
            });

    public static void setKey(String key,String value){
        localCache.put(key, value);
    }

    public static String getKey(String key){
        String value = null;
        try{
            value = localCache.get(key);
            if("null".equals(value)){
                return null;
            }
            return value;
        }catch (Exception e){
            logger.error("localCache get error",e);
        }
        return null;
    }
}

麻烦您了

0 回复 有任何疑惑可以回复我~
提问者 黑色天空8655 2018-12-31 22:49:08
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();
        TokenCache.setKey(TokenCache.TOKEN_PREFIX+username,forgetToken);
        return ServerResponse.createBySuccess(forgetToken);
    }
    return ServerResponse.createByErrorMessage("问题的答案错误");
}

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);
    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("修改密码失败");
}


0 回复 有任何疑惑可以回复我~
  • 同学,你好,请你提供测试的响应结果。根据你的描述,只有可能是token过期或token错误这两个结果,你需要检查StringUtils.equals(forgetToken,token)这段代码执行是否成立,如果不成立,那就是你传过来的token有问题。
    希望能帮助到你。
    回复 有任何疑惑可以回复我~ 2018-12-31 23:48:46
  • 提问者 黑色天空8655 回复 geelylucky #2
    {
    "status": 1,
    "msg": "token无效或过期"
    }
    是这个测试结果吗,老师我根据您说的排查了token.setkey()语句没问题啊,还有可能哪里会导致传过来的token有问题呢
    回复 有任何疑惑可以回复我~ 2019-01-01 11:39:46
  • geelylucky 回复 提问者 黑色天空8655 #3
    同学,你要确定token到底是无效还是过期,如果是过期的话,这个就要看你设置的过期时间是否太短。你可以打印一下取出来的token,根据打印的结果做出合理的判断。你可以在设置token后立马取出来看看是否设置成功。我看了一下,基本的代码逻辑没有问题,应该是出在细节上,这个需要你自己debug才能定位到问题。
    回复 有任何疑惑可以回复我~ 2019-01-01 12:41:20
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信