【问题标题】:In Zuul gateway,How to modify the service path in custom filter?Zuul网关中,如何修改自定义过滤器中的服务路径?
【发布时间】:2019-01-04 04:08:00
【问题描述】:

我已经实现了一个zuul网关服务,用于我编写的一些微服务之间的通信。我有一个特定的场景,比如我想在我的一个自定义过滤器中更改服务路径并重定向到其他一些服务。 zuul网关可以做到这一点吗?我尝试将带有更新 uri 的“requestURI”参数放入路由过滤器中的请求上下文,但效果不佳

请帮帮我 提前致谢

【问题讨论】:

    标签: java spring-boot gateway netflix-zuul


    【解决方案1】:

    是的,你可以。为此,您需要使用PRE_TYPE 类型实现ZuulFilter,并使用指定的Location 标头和响应状态301 或302 更新响应。

    @Slf4j
    public class CustomRedirectFilter extends ZuulFilter {
    
        @Override
        public String filterType() {
            return FilterConstants.PRE_TYPE;
        }
    
        @Override
        public int filterOrder() {
            return FilterConstants.SEND_FORWARD_FILTER_ORDER;
        }
    
        @Override
        public boolean shouldFilter() {
            return true;
        }
    
        @Override
        public Object run() {
            RequestContext ctx = RequestContext.getCurrentContext();
            String requestUrl = ctx.getRequest().getRequestURL().toString();
    
            if (shouldBeRedirected(requestUrl)) {
                String redirectUrl = generateRedirectUrl(ctx.getRequest());
                sendRedirect(ctx.getResponse(), redirectUrl);
            }
            return null;
        }
    
        private void sendRedirect(HttpServletResponse response, String redirectUrl){
            try {
                response.setHeader(HttpHeaders.LOCATION, redirectUrl);
                response.setStatus(HttpStatus.MOVED_PERMANENTLY.value());
                response.flushBuffer();
            } catch (IOException ex) {
                log.error("Could not redirect to: " + redirectUrl, ex);
            }
        }
    
        private boolean shouldBeRedirected(String requestUrl) {
            // your logic whether should we redirect request or not
            return true;
        }
    
        private String generateRedirectUrl(HttpServletRequest request) {
            String queryParams = request.getQueryString();
            String currentUrl =  request.getRequestURL().toString() + (queryParams == null ? "" : ("?" + queryParams));
            // update url
            return updatedUrl;
        }
    }
    

    【讨论】:

    • 但我的请求是 POST 请求。我可以用同样的方式重定向一个帖子请求吗?
    • 我在网关中得到像 /abc/{id}/def/v1/add 这样的 url,我需要将该 url 路由到 /def/ v1/添加 。这是我的要求。@Vasiliy Sarzhynskyi
    猜你喜欢
    • 2016-05-27
    • 1970-01-01
    • 2015-09-12
    • 2023-03-04
    • 2017-08-23
    • 2018-12-28
    • 2015-04-12
    • 1970-01-01
    • 2019-07-31
    相关资源
    最近更新 更多