久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    解決Nginx+Tomcat時ContextPath不同的問題

     WindySky 2018-02-10

     

    1        問題描述

    項目前端模板使用Thymeleaf,在對各種URL進行格式化輸出時,都使用@{uri}代碼。它會自動讀取項目部署的虛擬路徑,添加到URI的前端輸出。

    真實測試和生產環境中,我們使用nginx+Tomcat的部署模式,這就會部署帶來一個限制:ngxin配置proxy時,需要同后端application使用相同的context path。

    一個比較典型的測試場景:同一個Tomcat,部署多個應用;同一個nginx,配置這三個應用的proxy,但要求都使用獨立域名進行訪問,不能添加 context path。如圖:

     

    2        Thymeleaf實現原理

    仔細讀Thymeleaf的源碼,它對uri的封裝,是通過 LinkBuilder類實現的。在SpringBoot項目中,相關的代碼。

     

    有幾點需要注意:

    1、              最終是在 StandardLinkBuilder中調用request.getContextPath()獲取部署context.

    2、              SpringTemplateEngine的構造函數中,直接new StandardLinkBuilder對象。

    3、              ThymeleafAutoConfiguration的代碼和相應的配置定義中,沒有發現對LinkBuilder的配置參數。

    3        解決方案

    根據項目情況,可以有幾個解決方案可供選擇。

    3.1   Filter + HttpServletRequestWrapper

    思路:最終代碼使用request.getContextPath(),我們只要重新封裝一下Request,重寫getContextPath()方法即可。

     

    并在項目中添加一個Filer,核心代碼為:

    public void doFilter(ServletRequest request, ServletResponse response,

      FilterChain filterChain) throws IOException, ServletException {

        CustomContextPathRequest requestWrapper =

          new CustomContextPathRequest( (HttpServletRequest) request, this.contextPath);

        filterChain.doFilter(requestWrapper, response);

    }

    3.2   擴展 AutoConfiguration

    咱重點介紹一下這個方法,借此機會熟悉SpringBoot的機制。

    思路:SpringBoot缺省的AutoConfiguration沒有提供配置LinkBuilder,我們自己實現一個AutoConfiguration,在Spring完成SpringTemplateEngine成功之后,再替換器LinkBuilder實現。

     

     

    3.2.1  ManualContextLinkBuilder

    例子是將context path寫死為 /demo ,實際代碼中,可以通過在application.propertis中的變量來實現,并配合maven profile,實現不同運行環境的差異化實現。

    public class ManualContextLinkBuilder extends StandardLinkBuilder {

    private String nginxContextPath = “/demo”;

     

    @Override

    protected String computeContextPath(final IExpressionContext context,

          final String base, final Map<String, Object> parameters) {

        return nginxContextPath;

    }

    }

     

    3.2.2  ManualContextLinkBuilderConfiguration

    @Configuration

    @AutoConfigureAfter(WebMvcAutoConfiguration.class)

    public class ManualContextLinkBuilderConfiguration {

      @Autowired

      SpringTemplateEngine springTemplateEngine;

     

      @Bean

      public ILinkBuilder linkBuilder() {

        ILinkBuilder linkBuilder = new ManualContextLinkBuilder();

        springTemplateEngine.setLinkBuilder(linkBuilder);

        return linkBuilder;

      }

    }

     

    3.2.3  META-INF/spring.factories

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

    tech.codestory.ManualContextLinkBuilderConfiguration

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 日韩中文字幕人妻精品| 亚洲欧美中文日韩V日本| 亚洲国产精品久久电影欧美| 免费AV片在线观看网址| 推油少妇久久99久久99久久| 成人无码影片精品久久久| 国产成人AV大片大片在线播放| XXXXXHD亚洲日本HD| 国产中文字幕精品免费| 亚洲国产午夜精品理论片妓女 | 国产精品亚洲二区亚瑟| 国产精品99久久久久久WWW| 一个人免费视频WWW在线观看| 国产玩具酱一区二区三区| 日韩av日韩av在线| 女性高爱潮视频| 无码人妻丝袜在线视频红杏| 成人做受120秒试看试看视频| 精品国产中文字幕懂色| 在线播放深夜精品三级| 精品国产中文字幕av| 白丝乳交内射一二三区| 成年女人免费碰碰视频| 狠狠综合久久综合88亚洲| 亚洲AV中文无码乱人伦在线咪咕| 国产成人精品久久综合| 色噜噜综合亚洲AV中文无码| 又爽又黄又无遮挡的激情视频免费 | 国产综合色产在线视频欧美| 桃花岛亚洲成在人线AV| 无码人妻斩一区二区三区 | 人妻少妇邻居少妇好多水在线| 亚洲高潮喷水无码AV电影| 国产桃色无码视频在线观看| 国产精品VA在线观看丝瓜影院| 最新中文乱码字字幕在线| 亚洲国产欧美一区二区好看电影| 国产一区二区日韩经典| 国产啪视频免费观看视频| 偷窥国产亚洲免费视频| 亚洲精品无码久久毛片|