package com.doumee.config.Jwt; 
 | 
  
 | 
import com.alibaba.fastjson.JSONObject; 
 | 
import com.doumee.biz.system.SystemDictDataBiz; 
 | 
import com.doumee.biz.zbom.model.zhongtai.ZTConstants; 
 | 
import com.doumee.config.annotation.UserLoginRequired; 
 | 
import com.doumee.config.annotation.LoginRequired; 
 | 
import com.doumee.core.constants.ResponseStatus; 
 | 
import com.doumee.core.exception.BusinessException; 
 | 
import com.doumee.core.utils.Constants; 
 | 
import com.doumee.core.utils.redis.RedisUtil; 
 | 
import com.doumee.dao.business.model.Member; 
 | 
import com.doumee.dao.business.model.Users; 
 | 
import io.jsonwebtoken.JwtException; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.beans.factory.annotation.Value; 
 | 
import org.springframework.context.annotation.Bean; 
 | 
import org.springframework.context.annotation.Configuration; 
 | 
import org.springframework.data.redis.core.RedisTemplate; 
 | 
import org.springframework.jdbc.core.BeanPropertyRowMapper; 
 | 
import org.springframework.jdbc.core.JdbcTemplate; 
 | 
import org.springframework.web.client.RestTemplate; 
 | 
import org.springframework.web.method.HandlerMethod; 
 | 
import org.springframework.web.servlet.HandlerInterceptor; 
 | 
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 
 | 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 
 | 
  
 | 
import javax.servlet.http.HttpServletRequest; 
 | 
import javax.servlet.http.HttpServletResponse; 
 | 
import java.util.Objects; 
 | 
  
 | 
@Configuration 
 | 
public class WebMvcConfig implements WebMvcConfigurer { 
 | 
  
 | 
  
 | 
    @Autowired 
 | 
    private JdbcTemplate dao; 
 | 
  
 | 
    @Autowired 
 | 
    private SystemDictDataBiz systemDictDataBiz; 
 | 
  
 | 
    @Autowired 
 | 
    private RedisTemplate<String,Object> redisTemplate; 
 | 
  
 | 
    /** 
 | 
     * 是否开发者 
 | 
     */ 
 | 
    @Value("${debug_model}") 
 | 
    private Boolean isDebug; 
 | 
  
 | 
    /** 
 | 
     * 添加拦截器 
 | 
     */ 
 | 
    @Override 
 | 
    public void addInterceptors(InterceptorRegistry registry) { 
 | 
        //API接口JwtToken拦截器 
 | 
        HandlerInterceptor TokenInterceptor = new HandlerInterceptor() { 
 | 
            @Override 
 | 
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
 | 
                // 如果不是映射到方法直接通过 
 | 
                if (!(handler instanceof HandlerMethod)) { 
 | 
                    return true; 
 | 
                } 
 | 
                HandlerMethod handlerMethod = (HandlerMethod) handler; 
 | 
  
 | 
                Class<?> beanType = handlerMethod.getBeanType(); 
 | 
                Boolean checkFlag = false; 
 | 
                if(!( handlerMethod.hasMethodAnnotation(LoginRequired.class) || handlerMethod.hasMethodAnnotation(UserLoginRequired.class)) 
 | 
                ){ 
 | 
                    return true; 
 | 
                } 
 | 
                String token = request.getHeader(JwtTokenUtil.HEADER_KEY); 
 | 
                if(StringUtils.isBlank(token)){ 
 | 
                    throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录"); 
 | 
                } 
 | 
                if (handlerMethod.hasMethodAnnotation(LoginRequired.class)) { 
 | 
                        checkFlag = checkLogin(request,response,token); 
 | 
                } 
 | 
                if(!checkFlag && handlerMethod.hasMethodAnnotation(UserLoginRequired.class)){ 
 | 
                        checkFlag = checkPersonnelLogin(request,response,token); 
 | 
                } 
 | 
                if(!checkFlag){ 
 | 
                    throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录"); 
 | 
                } 
 | 
                return true; 
 | 
            } 
 | 
        }; 
 | 
        registry.addInterceptor(TokenInterceptor).addPathPatterns("/web/**"); 
 | 
    } 
 | 
  
 | 
  
 | 
    public Boolean checkLogin(HttpServletRequest request, HttpServletResponse response,String token){ 
 | 
        try { 
 | 
            String tokenRedis = (String) redisTemplate.opsForValue().get(ZTConstants.CUSTOMER+"_"+token); 
 | 
            if(StringUtils.isBlank(tokenRedis)){ 
 | 
                return false; 
 | 
            } 
 | 
            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); 
 | 
            } 
 | 
            if(Objects.isNull(member.getOpenid())){ 
 | 
                throw new BusinessException(ResponseStatus.USER_DISABLE_TIME.getCode(),"用户已注销,请重新登录"); 
 | 
            } 
 | 
            if(Constants.equalsInteger(member.getIsdeleted(),Constants.ONE)){ 
 | 
                throw new BusinessException(ResponseStatus.USER_DISABLE_TIME.getCode(),"用户已删除,请联系管理员"); 
 | 
            } 
 | 
            if(!Constants.equalsInteger(member.getStatus(),Constants.ZERO)){ 
 | 
                throw new BusinessException(ResponseStatus.USER_DISABLE_TIME.getCode(),"用户已禁用,请联系管理员"); 
 | 
            } 
 | 
            request.setAttribute(JwtTokenUtil.UserId_Name, memberId); 
 | 
            request.setAttribute(JwtTokenUtil.UserType, ZTConstants.CUSTOMER); 
 | 
            request.setAttribute(JwtTokenUtil.HEADER_KEY, ZTConstants.CUSTOMER+"_"+token); 
 | 
            request.setAttribute(JwtTokenUtil.UserInfo, tokenRedis); 
 | 
            return true; 
 | 
        } catch (IllegalArgumentException | JwtException e) { 
 | 
            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录"); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public Boolean checkPersonnelLogin(HttpServletRequest request, HttpServletResponse response,String token){ 
 | 
        try { 
 | 
            String tokenRedis = (String) redisTemplate.opsForValue().get(ZTConstants.BUSINESS+"_"+token); 
 | 
            if(StringUtils.isBlank(tokenRedis)){ 
 | 
                return false; 
 | 
            } 
 | 
            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); 
 | 
            } 
 | 
            if(Constants.equalsInteger(users.getIsdeleted(),Constants.ONE)){ 
 | 
                throw new BusinessException(ResponseStatus.USER_DISABLE_TIME.getCode(),"用户已删除,请联系管理员"); 
 | 
            } 
 | 
            if(!StringUtils.equals(users.getStatus(),Constants.ONE+"")){ 
 | 
                throw new BusinessException(ResponseStatus.USER_DISABLE_TIME.getCode(),"用户状态异常,请重新登录"); 
 | 
            } 
 | 
            request.setAttribute(JwtTokenUtil.UserId_Name, userId); 
 | 
            request.setAttribute(JwtTokenUtil.UserType, ZTConstants.BUSINESS); 
 | 
            request.setAttribute(JwtTokenUtil.HEADER_KEY, ZTConstants.CUSTOMER+"_"+token); 
 | 
            request.setAttribute(JwtTokenUtil.UserInfo, tokenRedis); 
 | 
            return true; 
 | 
        } catch (IllegalArgumentException | JwtException e) { 
 | 
            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录"); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Bean 
 | 
    public RestTemplate getRestTemplate(){ 
 | 
        return new RestTemplate(); 
 | 
    } 
 | 
  
 | 
    public Long getTokenId(String token){ 
 | 
        try { 
 | 
            Integer lastIndex = token.lastIndexOf("_")+1; 
 | 
            Long tokenId = Long.valueOf(token.substring(lastIndex)); 
 | 
            return tokenId; 
 | 
        }catch (Exception e){ 
 | 
            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录"); 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |