springcloud如何获取网关封装的头部信息
更新时间:2022年06月17日 10:35:32 作者:一一可可
这篇文章主要介绍了springcloud获取网关封装的头部信息,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
后台系统如何获取请求头里的数据
1. 网关层封装数据到head头
@Component
@Slf4j
public class LoginGatewayFilterFactory extends AbstractGatewayFilterFactory {
@Override
public GatewayFilter apply(Object config) {
return (exchange, chain) -> {
// 获取 request
ServerHttpRequest req = exchange.getRequest();
URI uri = req.getURI();
// 日志
log.info(StringUtils.join("【", req.getMethod(), "】", uri.getHost(), ":", uri.getPort(), ", 【path】", uri.getPath()));
// 检查请求 uri 是否需要鉴权
String path = uri.getPath();
if (StringUtils.equalsAny(path, "/sysLogin")) {
return chain.filter(exchange);
}
// 获取请求的 token
HttpHeaders reqHeaders = req.getHeaders();
String token = req.getHeaders().getFirst("token");
if (StringUtils.isBlank(token)) {
return FilterUtil.setParamToResponse(exchange, HttpStatus.UNAUTHORIZED, "请先登录");
}
// 验证 token
JWT jwt = JWTUtil.parseToken(token);
if (jwt == null) {
log.info(StringUtils.join("[token=", token, "]转换为jwt失败"));
return FilterUtil.setParamToResponse(exchange, HttpStatus.UNAUTHORIZED, "令牌未识别");
}
JSONObject json = jwt.getPayloads();
if (json == null || json.isEmpty() || json.isNull("key") || json.isNull(JWTPayload.ISSUED_AT)) {
log.info(StringUtils.join("[token=", token, "]解析异常"));
return FilterUtil.setParamToResponse(exchange, HttpStatus.UNAUTHORIZED, "令牌未识别");
}
String userId = json.get("key", String.class);
if (StringUtils.isBlank(userId)) {
return FilterUtil.setParamToResponse(exchange, HttpStatus.UNAUTHORIZED, "令牌未识别");
}
boolean verify = jwt.setKey(JwtUtils.createKey(userId)).verify();
if (!verify) {
return FilterUtil.setParamToResponse(exchange, HttpStatus.UNAUTHORIZED, "令牌未识别");
}
// 过期时间
long seconds = Instant.now().getEpochSecond() - json.get(JWTPayload.ISSUED_AT, Long.class);
if (seconds < 0) {
return FilterUtil.setParamToResponse(exchange, HttpStatus.UNAUTHORIZED, "令牌未识别");
} else if (seconds >= 1500 && seconds <= 1800) {
// 自动刷新令牌
ServerHttpResponse httpResponse = exchange.getResponse();
HttpHeaders repHeaders = httpResponse.getHeaders();
repHeaders.set("token", JwtUtils.createToken(userId));
} else if (seconds > 1800) {
// 登录超时
return FilterUtil.setParamToResponse(exchange, HttpStatus.UNAUTHORIZED, "登录超时");
}
Consumer<HttpHeaders> headersConsumer = httpHeaders -> {
for (Map.Entry<String, List<String>> entry : reqHeaders.entrySet()) {
httpHeaders.put(entry.getKey(), entry.getValue());
}
httpHeaders.add("userId", userId);
};
return chain.filter(exchange.mutate().request(req.mutate().headers(headersConsumer).build()).build());
};
}
}2. controller层代码实现
@ApiOperation(value = "添加")
@PostMapping("")
public PojoBaseResponse<Boolean> add(@RequestBody @Validated MainRouteDTO vo, @RequestHeader String userId) {
return ResponseUtils.pojo(mainRouteService.add(vo, userId));
}到此这篇关于springcloud获取网关封装的的文章就介绍到这了,更多相关springcloud网关头部信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
使用Java 8 Lambda表达式将实体映射到DTO的操作
这篇文章主要介绍了使用Java 8 Lambda表达式将实体映射到DTO的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-08-08
Netty组件NioEventLoopGroup创建线程执行器源码解析
这篇文章主要介绍了Netty组件NioEventLoopGroup创建线程执行器源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-03-03
Java并发编程之ReentrantLock实现原理及源码剖析
ReentrantLock 是常用的锁,相对于Synchronized ,lock锁更人性化,阅读性更强,文中将会详细的说明,请君往下阅读2021-09-09


最新评论