背景: 最近跟一个其他平台接口交互,有个接口鉴权的问题,一个拦截器搞定。
我们调用三方多个接口都需要加上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("/**");
}
}
扫描二维码关注公众号,回复:
12466133 查看本文章

新建一个全局拦截器:
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 {}
}
上面完成后,你项目的请求中,都会有你设置的请求头。
对你们有帮助的话,麻烦点个关注,后面我会继续分享各种实用技巧。
祝各位 一路顺风!!!