赞
踩
需求是这样的:服务器接口被恶意访问,越过了前端逻辑来调用后端接口,造成数据异常,现在需要阻止不是我们的前端发过来的请求
@Configuration
@Slf4j
public class GatewayRoutesConfiguration {
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
log.info("ServerGatewayFilter filtet........");
return builder.routes()
.route(r ->r.path("/xx/**")// 过滤访问某个服务的路径的请求
.filters(f -> f.stripPrefix(1) //服务降级,根据自己需求配置
.filters(new MyGatewayFilter())) // 传入自定义的过滤器
.uri("lb://xx-service")// 你的对应服务的spring.application.name
).build();
}
}
其中用到了Slf4j进行日志记录,根据自己需求配置
public class MyGatewayFilter implements GatewayFilter ,Ordered{ @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // log.info("ServerGatewayFilter filter "); HttpHeaders headers = exchange.getRequest().getHeaders(); List<String> list = headers.get("key"); // 从请求头中获取要校验的字符串,key替换成你要取的key if (list.isEmpty()) { return null; // 如果不存在,阻断 } // 判断userAgent中是否包含“自定义字符串”字样 for (String s : list) { int sign = StringUtils.indexOfIgnoreCase(s, "要校验的字符串"); // 使用StringUtils中的忽略大小写匹配字符串,返回所在的index,不存在则返回-1 if (sign >= 0) { return chain.filter(exchange); // 放行 } else return null; // 阻断,也可以return一个自定义异常,提示访问被阻断 return new MyException(400,"访问阻止"); } return null;//走不到这,但是方法要返回值 } @Override public int getOrder() { //拦截器优先级,越小位最先执行 return 0; }
实现GatewayFilter重写filter方法,注意返回值是reactor.core.publisher.Mono
至此,自定义过滤器就完成了,所有的判断操作都在自定义过滤器中进行操作,拿到整个请求,可以跟让前端自定义请求头中的某个内容以作为校验,只放行存在自定义内容的请求
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。