springboot jetty中的welcome page list不生效分析

最近一个项目从web工程迁移到了springboot,web容器不想用tomcat了,因为程序里面把静态资源及jsp都打到了jar里,一来更新程序的时候方便,只替换jar包就行,二是应用不需要太高的性能,这样足够用了,但是springboot中如果用tomcat,就面临着module中的静态资源打到jar里,最后这些jar再合到一个总的jar里,静态资源嵌套两层,tomcat在处理这种资源的时候特别慢,jetty没有这个问题,所以就换了jetty,换了jetty之后问题来了,welcome-file-list,在tomcat中,可以通过TomcatContextCustomizer写到context中,而jetty是用DefaultServlet来实现的,网上有很多说jetty的welcome-file-list不生效的,都是通过设置org.eclipse.jetty.servlet.Default.welcomeServlets为true,开启这个特性,好吧,那就找找相应的配置,在springboot中该怎么写,嗯,都是在WebAppContext中来设置,那就通过JettyServerCustomizer的customize方法先拿到Server,再从Server拿到handler,这里面就有一个WebAppContext,拿到context后,设置initParameter和welcomFiles,配置顺利写到DefaultServlet中,但是程序一启动,居然无效,无论怎么配,都是进index.html。接着查,发现DefaultServlet的doGet方法根本没起作用,也就是这个servlet没收到任何请求,这是为啥咧?会不会是SpringMvc的DispatcherServlet先响应了?有可能,通过下断点,发现DispatchServlet的order是-1,DefaultServlet的order是1,这样就排到后面了,那能不能把这个order改一下,让DefaultServlet先响应呢?结果证明是不行的,因为在DefaultServlet的初始化过程中,需要通过ServletHolder来初始化,holder的initialize方法中,判断_initOnStartup,也就是是否在启动的时候初始化,而该值会在设置order的时候,如果order>0,才为true,否则为false,这下就明白了,如果DefaultServlet的order为负,则不会被加载。
通过配置jetty走不通,那就试试springmvc,DispatcherServlet是通过DispatcherServletAutoConfiguration初始化的,里面用到了WebMvcProperties,这里看到loadOnStartup是-1,没的配了,再看看为啥只跳index.html吧,或许这个值能配,跟来跟去,这个值是在生成WelcomePageHandlerMapping时,通过resourceProperties的getWelcomPage得到的,而这个方法里,最终是拿到所有的staticLocations,然后再和index.html拼接后返回,到此,基本没希望通过配置来实现了。

最后,直接来到index.html里,加了个window.location.href='xxxx';

折腾了一天。。。。不想分段了,凑合看吧。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值