权限校验拦截器

package com.meritdata.cloud.base.interceptor;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.google.gson.Gson;
import com.meritdata.cloud.base.util.HttpServletRequestReader;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.alibaba.fastjson.JSON;
import com.meritdata.cloud.base.config.YmWebMvcConfigure;
import com.meritdata.cloud.redis.operator.RedisOperatorClient;

@Component
public class UserLoginHandlerInterceptor implements HandlerInterceptor {
    
    @Value("${user.redis.tokenExpireTime}")
    private long tokenExpireTime;

    private static final Logger logger = LoggerFactory.getLogger(UserLoginHandlerInterceptor.class);
    @Autowired
    private RedisOperatorClient redisOperator;
    

    public static final String AUTHORIZATION_TOKEN = "AUTHORIZATION_TOKEN";

    //白名单
    List<String> openApiUrls = new ArrayList<>();

    public UserLoginHandlerInterceptor() {
        //白名单API
        openApiUrls.add("/account/ymUser/service/ymUserlogin");


    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        String backToken = request.getHeader(AUTHORIZATION_TOKEN);


        String url = request.getRequestURI();
        logger.info("[UserLogin interceptor] :" + url);
        //
        if(openApiUrls.contains(url)){
            logger.info("[white] :" + url);
            return true;
        }
 

        if(StringUtils.isNotEmpty(backToken)){
            Object userStr = redisOperator.get(backToken);

            if(ObjectUtils.isEmpty(userStr)){
                Map<String, Object> map = new HashMap<>();
                map.put("success",false);
                map.put("message", "AUTHORIZATION_TOKEN  error");
                returnJson(response, new Gson().toJson(map));
                return false;
            }

            Map<String, Object> userMap = JSON.parseObject(userStr.toString(), new TypeReference<Map<String, Object>>(){});
            request.setAttribute("LOGCLOUD_USERID", userMap.get("id"));
            request.setAttribute("LOGCLOUD_PLATFORMCODE", userMap.get("platformCode"));
            redisOperator.expire(backToken, 7200);
            logger.info("backToken:" + backToken + "********");
            //把用户信息放到request中
            request.setAttribute("user", userMap);

        }else{
            logger.info("[unAuthUrl3] :" + url);
            request.setAttribute("message", "AUTHORIZATION_TOKEN ERROR");
            response.sendError(302,"未登录");
            return false;
        }
        
    }

    private void returnJson(HttpServletResponse response, String json) throws IOException {
        PrintWriter writer = null;
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=utf-8");
        response.sendError(302,"未登录");
        try {
            writer = response.getWriter();
            writer.print(json);

        } catch (IOException e) {
            logger.error("response error", e);
        } finally {
            if (writer != null)
                writer.close();
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) throws Exception {

    }
}

 

posted @ 2022-05-09 22:16  shog808  阅读(90)  评论(0)    收藏  举报