项目中,使用gateway作为统一的网关入口,进行token的校验后,会将token解析后的userId和phone等信息放到request的请求头中,到fegin后,需要进行拦截后发送给下游服务。
1.使用的fegin依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2.gateway中拦截token并解析的代码
统一的拦截类:
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.ruizhi.detection.common.TokenReturnEnum;
import com.ruizhi.detection.common.TokenUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
/**
* @description: 公共的权限过滤filter
* @Author:
* @Date: 2019/8/15 13:43
*/
@Component
public class ApiGlobalFilter implements GlobalFilter, Ordered {
/**
* 不进行token校验的地址
*/
@Value("#{'${jwt.ignoreUrlList}'.split(',')}")
public List<String> ignoreUrl;
@Autowired
private TokenUtil tokenUtil;
/**
* 拦截所有的请求头
* @param exchange
* @param chain
* @return
*/
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String requestUrl = exchange.getRequest().getPath().toString();
boolean status = CollectionUtil.contains(ignoreUrl, requestUrl);
if (!status){
String token = exchange.getRequest().getHeaders().getFirst("token");
ServerHttpResponse response = exchange.getResponse();
//没有数据
if (StrUtil.isBlank(token)) {
JSONObject message = new JSONObject();
message.put("code", TokenReturnEnum.TOKEN_NONE.getCode());
message.put("message", "鉴权失败,无token或手机号");
byte[] bits = message.toString().getBytes(StandardCharsets.UTF_8);
DataBuffer buffer = response.bufferFactory().wrap(bits);
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.getHeaders().add("Content-Type", "text/json;charset=UTF-8");
return response.writeWith(Mono.just(buffer));
//有数据
}else {
//校验token
Map<String, String> tokenInfoMap = tokenUtil.verifyJWT(token);
if (tokenUtil.TOKEN_ERROR.equals(tokenInfoMap.get("code"))){
JSONObject message = new JSONObject();
message.put("message", "token错误");
message.put("code", TokenReturnEnum.TOKEN_ERROR.getCode());
byte[] bits = message.toString().getBytes(StandardCharsets.UTF_8);
DataBuffer buffer = response.bufferFactory().wrap(bits);
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.getHeaders().add("Content-Type", "text/json;charset=UTF-8");
return response.writeWith(Mono.just(buffer));
}else if (

本文介绍如何在微服务架构中使用Spring Cloud Gateway作为统一网关,实现token验证及传递,并解决Feign调用中请求头信息传递的问题。
最低0.47元/天 解锁文章
2066

被折叠的 条评论
为什么被折叠?



