package com.fdkankan.scene.Interceptor; import cn.hutool.http.ContentType; import com.alibaba.fastjson.JSON; import com.fdkankan.common.constant.ErrorCode; import com.fdkankan.redis.constant.RedisKey; import com.fdkankan.redis.util.RedisUtil; import com.fdkankan.web.response.ResultData; import java.io.IOException; import java.nio.charset.StandardCharsets; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpHeaders; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; @Component @Slf4j public class TokenInterceptor implements HandlerInterceptor { @Autowired private RedisUtil redisUtil; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { response.setHeader(HttpHeaders.CONTENT_TYPE, ContentType.JSON.getValue()); response.setCharacterEncoding(StandardCharsets.UTF_8.name()); String token = request.getHeader("token"); log.info("token:{}", token); if(StringUtils.isEmpty(token)){ this.needLogin(request,response); return false; } try { String redisKey = String.format(RedisKey.USER_TOKEN_KEY, token); if(redisUtil.hasKey(redisKey)){ redisUtil.expire(redisKey,2 * 60 * 60); return true; } }catch (Exception e){ log.error("校验token缓存出错", e); } this.needLogin(request,response); return false; } private void needLogin(HttpServletRequest request, HttpServletResponse response) { try { ResultData error = ResultData.error(ErrorCode.TOKEN_NOT_FOUND); response.getWriter().append(JSON.toJSONString(error)); } catch (IOException e) { log.info("LoginInterceptor|needLogin|IOException|" + e); e.printStackTrace(); } } }