当前位置:   article > 正文

gateway自定义过滤器,限制Headers内容访问微服务,SpringCloud自定义过滤器,阻止浏览器访问_gateway header数量限制

gateway header数量限制

需求是这样的:服务器接口被恶意访问,越过了前端逻辑来调用后端接口,造成数据异常,现在需要阻止不是我们的前端发过来的请求

1.配置 server 服务路由

@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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

其中用到了Slf4j进行日志记录,根据自己需求配置

2.自定义过滤器

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;

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

实现GatewayFilter重写filter方法,注意返回值是reactor.core.publisher.Mono

至此,自定义过滤器就完成了,所有的判断操作都在自定义过滤器中进行操作,拿到整个请求,可以跟让前端自定义请求头中的某个内容以作为校验,只放行存在自定义内容的请求

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/301342?site
推荐阅读
相关标签
  

闽ICP备14008679号