拦截器使用技巧

背景: 最近跟一个其他平台接口交互,有个接口鉴权的问题,一个拦截器搞定。

我们调用三方多个接口都需要加上token参数,本身就springboot来说, 拿到的request 只能获取 header ,设置header 一般都是属于 客户端操作。

比如  使用 postman 可以手动设置请求头 header

如果你是使用 httpclient 的话,那么也是很容易解决这个问题的。可以私信我

因为我们项目是基于 feign调用。所以我想到的 是统一处理。代码如下

新建一个mvc配置类 WebMvcConfig.java

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {


    @Bean
    public GlobalInterceptorHandler globalInterceptorHandler(){
        return new GlobalInterceptorHandler();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(globalInterceptorHandler()).addPathPatterns("/**");
    }
}

 新建一个全局拦截器:

GlobalInterceptorHandler.java

/**
 *  token权限统一处理
 * @author yzgu
 */
public class GlobalInterceptorHandler extends HandlerInterceptorAdapter {
    private final Logger logger = LoggerFactory.getLogger(GlobalInterceptorHandler.class);

    /**
     *  xx平台权限通行证
     */
    private static final String MAP_TOKEN_HEADER = "OTHERNAME";

    @Value("${global.rocketmq.tags}")
    private String projectTag;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        //如果是options请求直接放过
        if(request.getMethod().matches(HttpMethod.OPTIONS.name())){
            return true;
        }
        if(!(handler instanceof HandlerMethod)) {
            return true;
        }
        logger.info("request请求地址path[{}] uri[{}]", request.getServletPath(),request.getRequestURI());
        Map<String,String> headerses = new HashMap<>();
        headerses.put("content-type","application/json");
        modifyHeaders(request,headerses);
        return true;
    }

    /**
     * 修改请求头信息
     * @param headerses
     * @param request
     */
    private void modifyHeaders(HttpServletRequest request,Map<String, String> headerses) {
        if (headerses == null || headerses.isEmpty()) {
            return;
        }
        try {
            HttpServletRequestImpl httpRequest = (HttpServletRequestImpl) request;
            HttpServerExchange exchange = httpRequest.getExchange();
            HeaderMap headerMap = exchange.getRequestHeaders();
            for (Map.Entry<String, String> entry : headerses.entrySet()) {
                headerMap.add(new HttpString(entry.getKey()), entry.getValue());
                //TODO ,这里可以做你们的设置操作哈,
                headerMap.add(new HttpString(MAP_TOKEN_HEADER), projectTag);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @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 {}
}

上面完成后,你项目的请求中,都会有你设置的请求头。

对你们有帮助的话,麻烦点个关注,后面我会继续分享各种实用技巧。

祝各位 一路顺风!!! 

猜你喜欢

转载自blog.csdn.net/qq_41165981/article/details/112765041