プロジェクトパスの下(コンテキストパスを設定されている場合)スプリングブート関連の構成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ページにポイント