仅允许GET、POST请求?!!

669 阅读1分钟

前言

前后端使用RESTful API风格交互,项目最后验收竟然要求仅允许GETPOST请求?!!

思路

  • 前端处理

    1.前端请求携带自定义请求头`origin-method`标识,值为原请求方法
    2.在请求拦截器中,非`GET`,`POST`请求改成`POST`
    
  • 网关处理

    网关通过自定义请求头`origin-method`获取原请求方法,修改请求方法转发到服务
    

实现

前端

  • Angular

    @Injectable()
    export class GetPostInterceptor implements HttpInterceptor {
    
      constructor() {}
    
      intercept(req: HttpRequest<any>, next: HttpHandler) {
        let originMethod = req.method;
        let newMethod = originMethod != 'GET' || originMethod != 'POST' ? 'POST' : originMethod;
        const newReq = req.clone({
          method: newMethod,
          headers: req.headers.set('origin-method', originMethod)
        });
        return next.handle(newReq);
      }
    }
    

网关

  • Nginx

    server {
    		# ...
            location / {
                    # 关键配置
                    # 修改请求方法
                    # nginx获取自定义请求头 ,官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#var_http_
                    proxy_method $http_origin_method
            }
    }
    
  • Spring Cloud Gateway

    @Order(Ordered.HIGHEST_PRECEDENCE)
    @Component
    public class GetPostGatewayFilter implements GlobalFilter {
    
        private final String HEADER_ORIGIN_METHOD = "origin-method";
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            ServerHttpRequest request = exchange.getRequest();
            String originMethod = request.getHeaders().getFirst(HEADER_ORIGIN_METHOD);
            HttpMethod method = HttpMethod.resolve(originMethod);
            if (method == null) {
                return chain.filter(exchange, filter);
            }
            ServerHttpRequest newReq = request.mutate().method(method).build();
            return chain.filter(exchange.mutate().request(newReq).build());
        }
    }
    

结尾

如果文章对你有帮助,请点 赞👍🏻 支持一下。若有错误之处或有更好的建议,欢迎指正,谢谢。