カスタム構築されたTomcatの春ブーツ404ページ

プロジェクトパスの下(コンテキストパスを設定されている場合)スプリングブート関連の構成404ページがためのものです
コンテキストパスの場合は空ではないで、コンテキスト・パスなしでアクセスパス場合、この時間は、白紙ページまたはTomcatのデフォルトの404ページを表示します
 
どのようにこの時間は、カスタムのTomcat 404ページを構築しましたか?
 
ソースorg.apache.catalina.valves.ErrorReportValueを実現するためのTomcatのエラーページを表示します。
レポートメソッドエラーページは、任意のデフォルトのエラーページを登録していない、登録されているかどうかを最初にチェックし、sendErrorPage法によるエラーページを送信
プライベート ブールsendErrorPage(文字列の場所、応答レスポンス){ 
        ファイルファイル = 新しいファイル(場所)。
        もし(!file.isAbsolute()){ 
            ファイル = 新しい  ファイル(getContainer()getCatalinaBase()、場所。); 
        } 
        もし(!file.isFile()|| file.canRead()){ 
            getContainer()のgetLogger()(警告する。
                     sm.getString( "errorReportValve.errorPageNotFound" 場所))。
            返す ; 
        } 
        //ハードコードされた今のところ。これはオプションのことを検討。バルブレベルまたは
         // ページレベル?
        response.setContentType( "text / htmlの" ); 
        response.setCharacterEncoding( "UTF-8" );
        試す(OutputStreamのOS = response.getOutputStream(); 
                入力ストリームは = 新しい  FileInputStreamを(ファイル);){ 
            IOTools.flow(ある、OS)。
        } キャッチ(IOExceptionを電子){ 
            getContainer()のgetLogger()(警告する。
                     sm.getString( "errorReportValve.errorPageIOException" 場所)、e)を、
            リターン ; 
        } 
        を返す 
    }

春のブートデフォルトラベル瓶のパッケージには、Tomcatを実行しているので、それは最初404.htmlは、リソースディレクトリの下に置くの外に404ページを取ることが必要であり、その後、レプリケーション・プロセスを開始します一時ディレクトリに、Tomcatのページ、404へのパスその上にページ。

達成するための2つの方法があります。

1、AOPによってErrorReportValueを登録し、デフォルトを変更します

インポートのjava.io.File;
インポートにjava.io.IOException;
インポートのjavax.servlet.Servlet。
輸入org.apache.catalina.startup.Tomcat。
輸入org.apache.catalina.valves.ErrorReportValve。
輸入org.apache.coyote.UpgradeProtocol。
輸入org.aspectj.lang.JoinPoint。
輸入org.aspectj.lang.annotation.After。
輸入org.aspectj.lang.annotation.Aspect;
輸入org.aspectj.lang.annotation.Pointcut;
輸入  org.springframework.boot.autoconfigure.condition.ConditionalOnClass。
インポート  org.springframework.boot.autoconfigure.web.embedded.TomcatWebServerFactoryCustomizer;
輸入  org.springframework.boot.web.embedded.tomcat.ConfigurableTomcatWebServerFactory;
輸入org.springframework.core.io.ClassPathResource。
輸入org.springframework.stereotype.Component。
輸入org.springframework.util.FileCopyUtils。
輸入com.bc.core.util.FileUtil。
@Aspect 
@ConditionalOnClass({サーブレット。クラス、のTomcat。クラス、UpgradeProtocol。クラス、TomcatWebServerFactoryCustomizer。クラス})
@Component 
パブリック クラス TomcatCustomizerAspect {
     @Pointcut("実行(公共ボイドorg.springframework.boot.autoconfigure.web.embedded.TomcatWebServerFactoryCustomizer.customize(*))" 公共 ボイドカスタマイズ(){ 
     } 
     @After(値 = "(カスタマイズ)" 公共 ボイド doAfter(ジョインポイントジョインポイント)スロー  {たThrowableを
           場合(!(joinPoint.getArgs()[0] のinstanceof   ConfigurableTomcatWebServerFactory)){
               返します
          } 
          ConfigurableTomcatWebServerFactory工場 =(ConfigurableTomcatWebServerFactory)joinPoint.getArgs()[0 ];
          addTomcat404CodePage(工場)。
     } 
     プライベート 静的 ボイド  addTomcat404CodePage(ConfigurableTomcatWebServerFactory工場){ 
          factory.addContextCustomizers((コンテキスト) - > { 
              文字列のパス = context.getCatalinaBase()ある、getPath()+ "/404.html"。; 
              ClassPathResourceのCR = 新しい   ClassPathResource(「404.html " );
               場合(cr.exists()){ 
                   ファイルfile404が = 新しいファイル(パス);
                    場合(!file404.exists(){)
                         してみてください{
                             FileCopyUtils.copy(cr.getInputStream()、FileUtil.openOutputStream(file404))。
                        } );キャッチ(IOExceptionを電子){ 
                             e.printStackTrace(); 
                        } 
                   } 
              } 
              ErrorReportValve弁 = 新しい  ErrorReportValve()。
              valve.setProperty( "errorCode.404" パス); 
              valve.setShowServerInfo(); 
              valve.setShowReport(); 
              valve.setAsyncSupported(
              context.getParent()getPipeline()addValve(バルブ)。
          }); 
     } 
}

2、カスタムBeanPostProcessorカスタムErrorReportValveを追加することにより、

インポートのjava.io.File;
インポートにjava.io.IOException;
インポートのjavax.servlet.Servlet。
輸入org.apache.catalina.startup.Tomcat。
輸入org.apache.catalina.valves.ErrorReportValve。
輸入org.apache.coyote.UpgradeProtocol。
輸入org.springframework.beans.BeansException。
輸入  org.springframework.beans.factory.config.BeanPostProcessor。
輸入  org.springframework.boot.autoconfigure.condition.ConditionalOnClass。
輸入  org.springframework.boot.autoconfigure.web.embedded.TomcatWebServerFactoryCustomizer。
インポート  org.springframework.boot.web.embedded.tomcat.ConfigurableTomcatWebServerFactory;
輸入org.springframework.core.io.ClassPathResource。
輸入org.springframework.stereotype.Component。
輸入org.springframework.util.FileCopyUtils。
輸入com.bc.core.util.FileUtil。
輸入lombok.extern.slf4j.Slf4j。
@ConditionalOnClass({サーブレット。クラス、のTomcat。クラス、UpgradeProtocol。クラス、TomcatWebServerFactoryCustomizer。クラス})
@Component 
@ SLF4J 
パブリック クラス TomcatCustomizerBeanPostProcessorの実装  BeanPostProcessor { 
     @Override 
     パブリックオブジェクトpostProcessAfterInitialization(オブジェクト・ビーン、文字列のbeanName)がスローBeansException {
           場合(豆のinstanceof   ConfigurableTomcatWebServerFactory){ 
              ConfigurableTomcatWebServerFactory configurableTomcatWebServerFactory =   (ConfigurableTomcatWebServerFactory)豆を、
              
              addTomcat404CodePage(configurableTomcatWebServerFactory)。
          } 
          を返す   BeanPostProcessorを。スーパー.postProcessAfterInitialization(豆、のbeanName)。
     } 
     プライベート 静的 無効  addTomcat404CodePage(ConfigurableTomcatWebServerFactory工場){ 
          factory.addContextCustomizers((コンテキスト) - > { 
              ストリングtomcatTempPath =   context.getCatalinaBase()ある、getPath(); 
              log.info( "Tomcatの目录:{}" 、tomcatTempPath); 
              文字列のパス = tomcatTempPath + " /404.html」; 
              ClassPathResourceのCR =    ClassPathResource( "" 404.html );
               場合(cr.exists()){ 
                   ファイルfile404 = 新しいファイル(パス);
                    場合(!file404.existsは()){
                         試みる{ 
                             FileCopyUtils.copy(cr.getInputStream()、FileUtil.openOutputStream(file404))。
                        } キャッチ(IOExceptionを電子){ 
                             e.printStackTrace(); 
                        } 
                   } 
              } 
              ErrorReportValve弁 = 新しい  ErrorReportValve()。
              valve.setProperty( "errorCode.404" パス); 
              valve.setShowServerInfo(); 
              valve.setShowReport();
              valve.setAsyncSupported(真の); 
              context.getParent()getPipeline()addValve(バルブ)。
          }); 
     } 
}

上記の二つのアプローチ、アクセスにプロジェクト名とプロジェクト(非プロジェクトパスのパス)は、任意の間違ったパスにアクセスする場合の両方が、達成することができ、カスタム404ページにポイント

おすすめ

転載: www.cnblogs.com/rinack/p/11239495.html