Bocky
Bocky

Reputation: 483

Adding Headers to Zuul when re-directing

I am trying to use Zuul to redirect calls to a downstream system somewhere else. In the re-direct, I need to add in a Header with necessary data for the api receiving the redirection to process. I can't seem to get the downstream system to detect this data. Attached is my code. I am using Zuul from Edgware.SR3, Spring Boot 1.5.12

Zuul Filter

@Component
public class RouteFilter extends ZuulFilter{

@Override
public Object run() {
//Testing to add header
    context.getRequest().getParameterMap().put("api", new String[]{"api"});
    context.getResponse().setHeader("api", api);
    context.addZuulResponseHeader("api", "api");
    context.addZuulRequestHeader("api", "api");
    context.setSendZuulResponse(false);
    context.put(FORWARD_TO_KEY, redirect_urls.get(key));
    context.setResponseStatusCode(HttpStatus.SC_TEMPORARY_REDIRECT);
    context.getResponse().sendRedirect(redirect_urls.get(key));
    return null;
}
}

Redirected Service Code

@RequestMapping(value = "/forward")
public ResponseEntity<String> forwardToMe(@RequestHeader(required = true, name = "api")String api){
    return new ResponseEntity<String>("Hi",HttpStatus.OK);
}

Error Received in Postman

{ "timestamp": 1524737817729, "status": 400, "error": "Bad Request", "exception": "org.springframework.web.bind.ServletRequestBindingException", "message": "Missing request header 'api' for method parameter of type String", "path": "/forward" }

Upvotes: 9

Views: 25820

Answers (5)

MrG
MrG

Reputation: 11

RequestContext ctx = RequestContext.getCurrentContext();
    String auth = "useeerrr" + ":" + "passsss";
    ctx.addZuulRequestHeader("Authorization", "Basic " +
            Base64Variants.MIME_NO_LINEFEEDS.encode(auth.getBytes(StandardCharsets.US_ASCII)));
    ctx.addZuulRequestHeader("X-USERNAME-HEADER","xxx");

    Map<String, List<String>> newParameterMap = new HashMap<>();
    Map<String, String[]> parameterMap = ctx.getRequest().getParameterMap();
    for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
        String key = entry.getKey();
        String[] values = entry.getValue();
        newParameterMap.put(key, Arrays.asList(values));
    }
   
    String authenticatedKey = "authenticated";
    String authenticatedValue = "true";
    newParameterMap.put(authenticatedKey,Arrays.asList(authenticatedValue));
    ctx.setRequestQueryParams(newParameterMap);
    HttpServletRequest request = ctx.getRequest();

    logger.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));

    return null;

Upvotes: 0

Pradyskumar
Pradyskumar

Reputation: 336

In case if anyone still facing this issue,

In Zuul Proxy add the header to RequestContext as below:

RequestContext ctx = RequestContext.getCurrentContext();
ctx.addZuulRequestHeader("param", "value");

And then in the respective microservices write a custom filter and extract the value as below

@Component
public class MyFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                HttpServletResponse response,
                                FilterChain filterChain)
                                throws ServletException, IOException {

        String headerParam  =   request.getHeaders("param").nextElement();
    
        logger.info("headerParam: "+headerParam);
    
        filterChain.doFilter(request, response);
    }

}

Upvotes: 2

didorg
didorg

Reputation: 437

A little late my response but works fine
As referred in the official documentation Cookies and Sensitive Headers
The sensitiveHeaders are a blacklist, and the default is not empty. Consequently, to make Zuul send all headers (except the ignored ones), you must explicitly set it to the empty list. Doing so is necessary if you want to pass cookie or authorization headers to your back end. The following example shows how to use sensitiveHeaders:

zuul:
  routes:
    entry:
      path: /users/**
      strip-prefix: false
      service-id: users-service
      sensitive-headers:
      - Cookie,Set-Cookie

This implemented example can also help you

Upvotes: 3

Thomas Tse
Thomas Tse

Reputation: 11

I update my comment here just in case if anyone is still facing this problem. I found this problem recently and resolved by adding the following configuration in my application.yml

application.yml ... zuul: sensitive-headers: - Cookie,Set-Cookie ...

Reference Link below:
https://cloud.spring.io/spring-cloud-static/Dalston.SR5/multi/multi__router_and_filter_zuul.html

Upvotes: 1

redoff
redoff

Reputation: 1144

I guess you use a Route Filter, maybe you can try with a Pre Filter.

Adding a custom header can be done with something like this : context.addZuulRequestHeader("Authorization", "Basic " + credentials);.

For the redirection part, you can check this thread

Upvotes: 5

Related Questions