k94314517
2024-07-22 1941e9fc342b3a2cb6d32e9658ad46f29f50a5df
server/service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java
@@ -65,27 +65,26 @@
                HandlerMethod handlerMethod = (HandlerMethod) handler;
                Class<?> beanType = handlerMethod.getBeanType();
//                Method method = handlerMethod.getMethod();
                Boolean checkFlag = false;
                // 有 @LoginRequired 注解,需要登录认证 客户端使用
                if (beanType.isAnnotationPresent(LoginRequired.class) || handlerMethod.hasMethodAnnotation(LoginRequired.class)) {
                    //获取token
                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);  // 从 http 请求头中取出 token
                    if (StringUtils.isNotBlank(token)) {
                        checkLogin(request,response);
                    } else {
                if ((beanType.isAnnotationPresent(LoginRequired.class) || handlerMethod.hasMethodAnnotation(LoginRequired.class))) {
                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
                    if(StringUtils.isBlank(token)){
                        throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
                    }
                    if (StringUtils.isNotBlank(token)) {
                        checkFlag = checkLogin(request,response,token);
                    }
                    // 有 @UserLoginRequired 注解,需要登录认证 内部人员使用
                } else if(beanType.isAnnotationPresent(UserLoginRequired.class) || handlerMethod.hasMethodAnnotation(UserLoginRequired.class)){
                        //ERP 业务注解
                        String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
                        if (StringUtils.isNotBlank(token)) {
                            checkPersonnelLogin(request,response);
                        } else {
                            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
                        }
                }
                if(beanType.isAnnotationPresent(UserLoginRequired.class) || handlerMethod.hasMethodAnnotation(UserLoginRequired.class)){
                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
                    if(StringUtils.isBlank(token)){
                        throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
                    }
                    if (StringUtils.isNotBlank(token)) {
                        checkFlag = checkPersonnelLogin(request,response,token);
                    }
                }
                return true;
            }
@@ -94,12 +93,9 @@
    }
    public Boolean checkLogin(HttpServletRequest request, HttpServletResponse response){
        String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
    public Boolean checkLogin(HttpServletRequest request, HttpServletResponse response,String token){
        try {
            //获取账号ID
            Long memberId = JwtTokenUtil.getJwtPayLoad(token).getUserId();
            String tokenRedis = (String) redisTemplate.opsForValue().get(ZTConstants.CUSTOMER+"_"+memberId);
            String tokenRedis = (String) redisTemplate.opsForValue().get(ZTConstants.CUSTOMER+"_"+token);
            if(StringUtils.isNotBlank(tokenRedis)){
                if(!tokenRedis.equals(token)){
                    throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录");
@@ -107,7 +103,8 @@
            }else{
                throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录");
            }
            Member member = dao.queryForObject(" select  *  from `member` where id  = ?  limit 1  ", new BeanPropertyRowMapper<>(Member.class),memberId );
            Long memberId = getTokenId(token);
            Member member = dao.queryForObject(" select  *  from `member` where id  = ?  limit 1  ", new BeanPropertyRowMapper<>(Member.class),memberId);
            if(Objects.isNull(member)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY);
            }
@@ -125,12 +122,9 @@
        }
    }
    public Boolean checkPersonnelLogin(HttpServletRequest request, HttpServletResponse response){
        String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
    public Boolean checkPersonnelLogin(HttpServletRequest request, HttpServletResponse response,String token){
        try {
            //获取账号ID
            Long userId = JwtTokenUtil.getJwtPayLoad(token).getUserId();
            String tokenRedis = (String) redisTemplate.opsForValue().get(ZTConstants.BUSINESS+"_"+userId);
            String tokenRedis = (String) redisTemplate.opsForValue().get(ZTConstants.BUSINESS+"_"+token);
            if(StringUtils.isNotBlank(tokenRedis)){
                if(!tokenRedis.equals(token)){
                    throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录");
@@ -138,6 +132,7 @@
            }else{
                throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录");
            }
            Long userId = getTokenId(token);
            Users users = dao.queryForObject(" select  *  from `users` where id  = ?  limit 1  ", new BeanPropertyRowMapper<>(Users.class),userId);
            if(Objects.isNull(users)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY);
@@ -161,5 +156,14 @@
        return new RestTemplate();
    }
    public Long getTokenId(String token){
        try {
            Integer lastIndex = token.lastIndexOf("_")+1;
            Long tokenId = Long.valueOf(token.substring(0,lastIndex));
            return tokenId;
        }catch (Exception e){
            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
        }
    }
}