AWS ELB配置HTTPS转HTTP时,Jersey中scheme的问题

来源:互联网 发布:停车场收费查询软件 编辑:程序博客网 时间:2024/06/05 00:17

AWS ELB配置HTTPS转HTTP

这个时候,后端instance收到的请求就是http,如果你使用了类似UriInfo.getBaseUri这样的方法去构造HATEOS,那么你返回的URI就会是http://api.server.com/,而非https://api.server.com/


读ELB相关文档,ELB会在request上加上X-Forwarded-Proto,所以,我们可以在jersey中加一个prefilter,查看是否有该配置,如果有,则修改UriBuilder中的scheme即可。代码如下



@PreMatching

public class ForwardedProtocolFilter implements ContainerRequestFilter {
    @Override
    public void filter(ContainerRequestContext ctx) throws IOException {


        String scheme = getValue(ctx.getHeaders(), "X-Forwarded-Proto");
        String port = getValue(ctx.getHeaders(), "X-Forwarded-Port");     // For Grizzly
        if (scheme == null && port == null)
            return;


        UriBuilder baseBuilder = ctx.getUriInfo().getBaseUriBuilder();
        UriBuilder requestBuilder = ctx.getUriInfo().getRequestUriBuilder();
        if (scheme != null) {
            baseBuilder.scheme(scheme);
            requestBuilder.scheme(scheme);
        }


        if (port != null) {
            int nPort = Integer.parseInt(port);
            baseBuilder.port(nPort);
            requestBuilder.port(nPort);
        }


        // maake sure to set both base and request URIs
        ctx.setRequestUri(baseBuilder.build(), requestBuilder.build());
    }


    private String getValue(MultivaluedMap<String, String> headers, String header) {
        List<String> values = headers.get(header);
        if (values == null || values.isEmpty())
            return null;


        return values.get(0);
    }

}


:如果你在ELB后面配了nginx,那么需要配置nginx的proxy_pass_header X-Forwarded-Proto;

    location ^~ /about {
      proxy_set_header  Host $host;
      proxy_pass_header X-Forwarded-Proto;
      ...
    }


参考资料:

http://jersey.576304.n2.nabble.com/UriInfo-oddness-on-Jetty-vs-Grizzly-td7582020.html

http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#proxy-protocol

0 0
原创粉丝点击