gateway网关token的校验
再加入gateway网关之后,我们在后台服务的许多校验操作都可以移动到gateway网关, 今天我就来说一下怎么校验请求携带的token。
首先我们需要编写一个局部过滤器,继承AbstractGatewayFilterFactory如下
然后在apply方法中实现自己要校验的逻辑,所有的请求参数或者token都可以通过request获取。 验证失败我在catch捕捉异常, 然后将异常信息返回给前端请求,返回信息的异常处理是这样的
e.printStackTrace();
ServerHttpResponse response = exchange.getResponse();
JSONObject message = new JSONObject();
message.put("status", -1);
message.put("data", e.getMessage());
byte[] bits = message.toJSONString().getBytes(StandardCharsets.UTF_8);
DataBuffer buffer = response.bufferFactory().wrap(bits);
response.setStatusCode(HttpStatus.UNAUTHORIZED);
//指定编码,否则在浏览器中会中文乱码
response.getHeaders().add("Content-Type", "text/plain;charset=UTF-8");
return response.writeWith(Mono.just(buffer));
状态码根据需求自己定义,异常信息就可以放回给前端请求。
至于校验通过,就直接放行即可
chain.filter(exchange);
如果还需要修改返回的路径请求可以这样
// 修改路径
String newPath ="/test/" + request.getPath();
ServerHttpRequest newRequest = request.mutate()
.path(newPath)
.build();
exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, newRequest.getURI());
//放行
return chain.filter(exchange.mutate()
.request(newRequest).build());
以上就是过滤器的编写, 然后就是路由的配置,我是在yml文件中配置
routes:
- id: token_routh
uri: lb://test-service
order: 0
predicates:
- Path=/test/**
filters:
# 去除/test
- StripPrefix=1
- TokenApi
filters下面的TokenApi对应的过滤器就是刚刚编写的过滤器,以上就完成了 对指定接口校验的功能。
希望能帮助大家