spring cloud zuul网关整合https时出现的问题

这里提出一些踩过的坑而且目前网上一下子找不到解决方法的,给出来让大家在遇到的时候进行解决.

场景:公司使用框架springcloud,在开发过程中需要从http转换为https,大家都知道https都为443端口.

 一般情况下我们都是使用zuul网关去整合https,在application.yml配置文件中会添加ssl相关的配置如下:

ssl:
  key-store: classpath:ssl.jks
  key-store-password: itlong
  keyStoreType: JKS
  keyAlias: ssl

然后在网关的serverApplication.java启动类中加入如下的方法在springboot中使用

TomcatEmbeddedServletContainerFactory工厂生产一个新的tomcat

比如原来zuul网关使用8999端口http请求,在整合的时候会将zuul网关设置端口改为443端口,在zuul网关内置工厂生产的tomcat中监听原来的8999端口并.此时会根据业务场景是否保留原来的8999端口,如果不保留需要将接受到的8999端口的请求重定向到本机的443端口.

 

下边是serverApplication.java网关启动类中代码:

public static void main(String[] args) {
    SpringApplication.run(GetwayServerApplication.class, args);

    //设置tomcat入参允许输入字符
     System.setProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow","|{}");
    }

@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
        @Override
        protected void postProcessContext(Context context) {
            SecurityConstraint securityConstraint = new SecurityConstraint();
            securityConstraint.setUserConstraint("CONFIDENTIAL");
            SecurityCollection collection = new SecurityCollection();
            //此处是重要点 如果访问下方重定向是打开状态那么就需要定义重定向请求的使用方法
            //各位如果遇到重定向的时候转发类型不匹配时请自行处理
            collection.addMethod("post");
            collection.addPattern("/*");
            securityConstraint.addCollection(collection);
            context.addConstraint(securityConstraint);
        }
    };
    tomcat.addAdditionalTomcatConnectors(httpConnector());
    return tomcat;
}
@Bean
    public Connector httpConnector(){
        Connector connector = new Connector(TomcatEmbeddedServletContainerFactory.DEFAULT_PROTOCOL);
        connector.setScheme("http");
        connector.setPort(8999);
        connector.setSecure(false);
        //此处是重要点下方会讲解
        connector.setAttribute("maxHttpHeaderSize","4048576");
//        connector.setRedirectPort(443);//此处为设置是否在接受到8999请求时重新转发到443端口
        return connector;
    }

上述代码中connector.setAttribute("maxHttpHeaderSize","4048576"); 这一处为设定内置工厂tomcat实例基础参数方法,

在工作中遇到的问题是当项目网关使用443时并保留原来8999端口(因为某些原因需要保留下来不进行重定向)

此时必须使用8999的服务的业务发送过长请求时会报出一个错误 Request header is too large,解决此问题网上大多都是在application.yml配置文件中添加如下配置来修改max-http-header-size的大小


server:
  #tomcat:
    #max-http-post-size: -1
  max-http-header-size: 4048576

但是我们现在使用内置的工厂创建的tomcat无法使用配置去修改其max-http-header-size属性,在各大网站查询了很久都没有寻找到方法无意中看到了Connector中有setAttribute这个方法抱着试一试的心态修改了一下也就是上边的connector.setAttribute("maxHttpHeaderSize","4048576");这句代码进行修改,重新测试后发现生效了.也就是说这句话可以修改内置工厂生成的tomcat实例参数.

 

以上就是本次发现的问题,各位如果在使用zuul网关并且需要使用zuul网关中的工厂创建新的tomcat时而访问网关的时候报出Request header is too large请求头过大需要修改maxHttpHeaderSize这个参数大小时请使用上述方法,目测其他tomcat参数也可以使用此方法进行修改.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值