首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当请求从zuul转发到不同的端点时,一些post参数会被丢弃

问当请求从zuul转发到不同的端点时,一些post参数会被丢弃
EN

Stack Overflow用户
提问于 2017-06-29 19:15:01
回答 1查看 1.1K关注 0票数 0

在spring boot + entflix zuul中,当我从zuul中的路由过滤器重定向到与原始端点不同的端点时,空的post参数被丢弃。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2017-06-29 19:32:57

这很奇怪,但仍然找不出确切的原因。通常情况下,HttpServelteRequest POST请求与原始请求相同。但在zuul中,request对象被zuul neflix请求包装,也许会发生这种情况。也许netflix的人可以回答这个问题。

最近,我找到了一个解决方法,可以获取netflix上下文对象的请求和响应外观,然后重定向。这对我很管用。

代码语言:javascript
复制
import java.lang.reflect.Field;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponseWrapper;

import org.apache.catalina.connector.RequestFacade;
import org.apache.catalina.connector.ResponseFacade;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.http.HttpServletRequestWrapper;

/**
 * 
 * @author Sivakumaran Kathamutthu
 *
 */
@Component
public class RouteFilter extends ZuulFilter {

  private static final Logger LOGGER = LoggerFactory.getLogger(RouteFilter.class);


  @Override
  public String filterType() {
    return "route";
  }

  @Override
  public int filterOrder() {
    return 0;
  }

  @Override
  public boolean shouldFilter() {
    return redirectFrom != null && !redirectFrom.trim().isEmpty()
        && RequestContext.getCurrentContext().getRequest().getRequestURI().contains(redirectFrom);
  }

  @Override
  public Object run() {
    RequestContext context = RequestContext.getCurrentContext();
    setRouteHost(context);

    return null;
  }

  /**
   * This method allows to set the route host into the Zuul request context
   * provided as parameter. The url is extracted from the orginal request and
   * the host is extracted from it.
   *
   * @param context the provided Zuul request context
   */
  private void setRouteHost(RequestContext context) {

    String requestURI = context.getRequest().getRequestURI();

    try {

      Field requestField = ReflectionUtils.findField(HttpServletRequestWrapper.class, "req", HttpServletRequest.class);

      if (requestField != null) {

        requestField.setAccessible(true);

        // Get the com.netflix.zuul.http.HttpServletRequestWrapper
        HttpServletRequestWrapper zuulWrappedRequest = (HttpServletRequestWrapper) ReflectionUtils.getField(requestField, ((HttpServletRequestWrapper) context.getRequest()).getRequest());

        // Get the requestFacade where original request resides
        RequestFacade requestFacade = (RequestFacade) ReflectionUtils.getField(requestField, zuulWrappedRequest);

        // Get the responseFacade where original response resides
        ResponseFacade responseFacade = (ResponseFacade) ((HttpServletResponseWrapper) context.getResponse()).getResponse();



        requestFacade.getRequestDispatcher("home/home.jsp").forward(requestFacade, responseFacade);

      } else {

        throw new RuntimeException("req field is not availble in HTTPServletRequest");
      }

    } catch (Exception ex) {

      throw e;    
    }

  }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44823597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档