久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

自定義Spring Boot內置Tomcat的404頁面

spring boot 的相關404頁面配置都是針對項目路徑下的(如果配置了 context-path)

在context-path不為空的情況下,如果訪問路徑不帶context-path,這時候會顯示空白頁面或者是tomcat默認404頁面

這時候如何自定義內置tomcat的404頁面呢?

查看tomcat錯誤頁面的實現源碼org.apache.catalina.valves.ErrorReportValue:

report方法中先查找是否注冊了錯誤頁面,默認情況未注冊任何錯誤頁面,然后通過sendErrorPage方法發送錯誤頁面

private boolean sendErrorPage(String location, Response  response) {
        File file = new File(location);
        if (!file.isAbsolute()) {
            file = new  File(getContainer().getCatalinaBase(), location);
        }
        if (!file.isFile() || !file.canRead()) {
            getContainer().getLogger().warn(
                    sm.getString(“errorReportValve.errorPageNotFound”,  location));
            return false;
        }
        // Hard coded for now. Consider making this  optional. At Valve level or
        // page level?
        response.setContentType(“text/html”);
        response.setCharacterEncoding(“UTF-8”);
        try (OutputStream os = response.getOutputStream();
                InputStream is = new  FileInputStream(file);){
            IOTools.flow(is, os);
        } catch (IOException e) {
            getContainer().getLogger().warn(
                    sm.getString(“errorReportValve.errorPageIOException”,  location), e);
            return false;
        }
        return true;
    }

由于spring boot 默認打成的jar包運行tomcat,所以必須要把404頁面放到外部,這里先將404.html放到resource目錄下,然后啟動過程中將頁面復制到tomcat臨時目錄,將404路徑指向該頁面就可以了。

這里有兩種實現辦法:

1、通過AOP修改默認注冊的ErrorReportValue

import Java.io.File;
import java.io.IOException;
import javax.servlet.Servlet;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.UpgradeProtocol;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import  org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import  org.springframework.boot.autoconfigure.web.embedded.TomcatWebServerFactoryCustomizer;
import  org.springframework.boot.web.embedded.tomcat.ConfigurableTomcatWebServerFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import org.springframework.util.FileCopyUtils;
import com.bc.core.util.FileUtil;
@Aspect
@ConditionalOnClass({ Servlet.class, Tomcat.class,  UpgradeProtocol.class,  TomcatWebServerFactoryCustomizer.class })
@Component
public class TomcatCustomizerAspect {
    @Pointcut(“execution(public void  org.springframework.boot.autoconfigure.web.embedded.TomcatWebServerFactoryCustomizer.customize(*))”)
    public void customize() {
    }
    @After(value = “customize()”)
    public void doAfter(JoinPoint joinPoint) throws  Throwable {
          if (!(joinPoint.getArgs()[0] instanceof  ConfigurableTomcatWebServerFactory)) {
              return;
          }
          ConfigurableTomcatWebServerFactory factory =  (ConfigurableTomcatWebServerFactory)  joinPoint.getArgs()[0];
          addTomcat404CodePage(factory);
    }
    private static void  addTomcat404CodePage(ConfigurableTomcatWebServerFactory  factory) {
          factory.addContextCustomizers((context) -> {
              String path =  context.getCatalinaBase().getPath() + “/404.html”;
              ClassPathResource cr = new  ClassPathResource(“404.html”);
              if (cr.exists()) {
                  File file404 = new File(path);
                  if (!file404.exists()) {
                        try {
                            FileCopyUtils.copy(cr.getInputStream(),  FileUtil.openOutputStream(file404));
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                  }
              }
              ErrorReportValve valve = new  ErrorReportValve();
              valve.setProperty(“errorCode.404”, path);
              valve.setShowServerInfo(false);
              valve.setShowReport(false);
              valve.setAsyncSupported(true);
              context.getParent().getPipeline().addValve(valve);
          });
    }
}

2、通過自定義BeanPostProcessor添加自定義的ErrorReportValve

import java.io.File;
import java.io.IOException;
import javax.servlet.Servlet;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.UpgradeProtocol;
import org.springframework.beans.BeansException;
import  org.springframework.beans.factory.config.BeanPostProcessor;
import  org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import  org.springframework.boot.autoconfigure.web.embedded.TomcatWebServerFactoryCustomizer;
import  org.springframework.boot.web.embedded.tomcat.ConfigurableTomcatWebServerFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import org.springframework.util.FileCopyUtils;
import com.bc.core.util.FileUtil;
import lombok.extern.slf4j.Slf4j;
@ConditionalOnClass({ Servlet.class, Tomcat.class,  UpgradeProtocol.class,  TomcatWebServerFactoryCustomizer.class })
@Component
@Slf4j
public class TomcatCustomizerBeanPostProcessor implements  BeanPostProcessor {
    @Override
    public Object postProcessAfterInitialization(Object  bean, String beanName) throws BeansException {
          if (bean instanceof  ConfigurableTomcatWebServerFactory) {
              ConfigurableTomcatWebServerFactory  configurableTomcatWebServerFactory =  (ConfigurableTomcatWebServerFactory) bean;
             
              addTomcat404CodePage(configurableTomcatWebServerFactory);
          }
          return  BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
    private static void  addTomcat404CodePage(ConfigurableTomcatWebServerFactory  factory) {
          factory.addContextCustomizers((context) -> {
              String tomcatTempPath =  context.getCatalinaBase().getPath();
              log.info(“tomcat目錄:{}”, tomcatTempPath);
              String path = tomcatTempPath + “/404.html”;
              ClassPathResource cr = new  ClassPathResource(“404.html”);
              if (cr.exists()) {
                  File file404 = new File(path);
                  if (!file404.exists()) {
                        try {
                            FileCopyUtils.copy(cr.getInputStream(),  FileUtil.openOutputStream(file404));
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                  }
              }
              ErrorReportValve valve = new  ErrorReportValve();
              valve.setProperty(“errorCode.404”, path);
              valve.setShowServerInfo(false);
              valve.setShowReport(false);
              valve.setAsyncSupported(true);
              context.getParent().getPipeline().addValve(valve);
          });
    }
}

上面兩種辦法,都就可以達到,如果項目訪問帶項目名,訪問任意錯誤路徑(非項目路徑下的路徑),指向自定義的404頁面

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
日韩毛片视频| 欧美片第1页综合| 精品久久网站| 日本少妇精品亚洲第一区| 亚洲一区二区三区久久久| 免费视频最近日韩| 日韩一区二区免费看| 在线一区免费观看| 丝袜诱惑制服诱惑色一区在线观看 | 日韩精品午夜视频| 亚洲精品在线a| 日韩av一区二区三区四区| 日韩激情一二三区| 日本精品久久| 国产欧美二区| 电影91久久久| 黑森林国产精品av| 极品av在线| 亚洲v在线看| 夜夜精品视频| 亚洲aⅴ网站| 国产精品mm| 国产一区二区三区久久| 电影亚洲精品噜噜在线观看| 激情偷拍久久| 蜜桃免费网站一区二区三区| 日韩在线视频一区二区三区| 久久99久久久精品欧美| 精品网站999| 水蜜桃精品av一区二区| 久久国产日韩| 国产一区二区三区免费在线| 日韩精品免费一区二区三区| 国产亚洲精品久久久久婷婷瑜伽| 亚洲一区二区三区久久久| 欧美亚洲色图校园春色| 欧美国产精品| 国产精品精品| 久久国产精品久久久久久电车| 青草综合视频| 久久电影tv| 亚洲一区二区动漫| 国产一卡不卡| 精品一级视频| 欧美日韩水蜜桃| 蜜臀av在线播放一区二区三区 | 日韩精品第一| 荡女精品导航| 午夜久久福利| 日本aⅴ亚洲精品中文乱码| 国产一区二区三区四区二区| 午夜欧美精品| 国产精品美女午夜爽爽| 国产一区日韩欧美| 国产一级成人av| 日韩电影免费在线观看| 欧美日韩国产一区二区三区不卡 | 国产精品巨作av| 欧美亚洲在线日韩| 奇米亚洲欧美| 久久久噜噜噜| 欧美一区二区三区久久精品| 免费在线小视频| 日本va欧美va瓶| 日韩精品一卡| 777久久精品| 亚洲午夜电影| 欧美色综合网| 日韩综合一区| 亚洲精品亚洲人成在线观看| 成人片免费看| 欧美三级第一页| 国产精品av久久久久久麻豆网| 日韩精品a在线观看91| 欧美日韩免费观看视频| 日韩亚洲精品在线观看| 麻豆精品蜜桃| 国产精品igao视频网网址不卡日韩| 蜜桃国内精品久久久久软件9| 久久av免费| 蜜臀av国产精品久久久久| 国产高清不卡| 亚洲tv在线| 欧美激情另类| 欧美精品国产一区| 在线午夜精品| 日韩一区二区三区免费播放| 91精品视频一区二区| 午夜av一区| 高清精品久久| 国产欧美在线| 老司机久久99久久精品播放免费| 捆绑调教日本一区二区三区| 日韩在线观看中文字幕| 国产91精品对白在线播放| 美女久久精品| 亚洲理论在线| 视频一区中文| 久久99国产精品视频| 亚洲精品在线a| 久久一级电影| 成人精品视频| 国产三级一区| 人人精品人人爱| 欧美日韩一区二区综合| 国产91欧美| 麻豆国产精品| 国产调教一区二区三区| 一区二区三区四区日韩| 国产99亚洲| 国产精品99一区二区三区| 欧美日一区二区三区在线观看国产免| 日韩一级精品| 999精品在线| 亚洲欧洲美洲av| 精品91福利视频| 久久男人av| 久久中文字幕一区二区三区| 国产精品115| 国产欧美日韩在线一区二区| 日韩高清不卡一区二区| 亚洲丝袜美腿一区| 日韩在线一二三区| 亚洲永久字幕| 夜夜嗨av一区二区三区网站四季av| 丝袜av一区| 日本少妇一区| 日韩精品一区二区三区免费观影| 久久精品国产网站| 久久久免费人体| 欧美成人精品午夜一区二区| 7777精品| 欧美在线91| 国产毛片精品| 久久av网址| 欧美国产美女| 999精品在线| 欧美在线亚洲| 久色成人在线| 日韩美女国产精品| 日本不卡一二三区黄网| 日韩黄色av| 欧美日韩一区二区国产| 日本成人精品| 国产精品毛片久久久| 麻豆一区二区在线| 捆绑调教日本一区二区三区| 999久久久免费精品国产| 精品一区在线| 中文无码久久精品| 国产丝袜一区| 中文在线а√在线8| 精品欧美激情在线观看| 亚洲欧美日韩在线观看a三区 | 蜜臀va亚洲va欧美va天堂| 国产精品毛片在线| 综合亚洲色图| 国产精品对白久久久久粗| 高清av一区| 欧美亚洲精品在线| 在线观看亚洲精品福利片| 青草综合视频| 久久久久久色 | 蜜臀久久99精品久久久久久9| 日韩中文av| 国产精品视频一区二区三区综合| 国产精品色婷婷在线观看| 国产suv精品一区| 亚洲精品国产偷自在线观看| 亚洲v天堂v手机在线| 麻豆中文一区二区| 亚洲h色精品| 亚洲欧洲免费| 四虎国产精品免费观看| 亚洲免费观看| 国产精品theporn| 久久激情一区| 综合激情网站| 国产精品亚洲综合久久| 另类中文字幕国产精品| 爽爽淫人综合网网站| 欧美日韩黄网站| 亚洲三级欧美| 亚洲一区二区成人| 麻豆久久久久久久| 狠狠色综合网| 国产精品欧美三级在线观看| 久久久一本精品| 亚洲精品免费观看| 精品国产免费人成网站| 视频一区在线视频| 老牛国内精品亚洲成av人片| 欧美va天堂在线| 啪啪亚洲精品| 久久中文字幕av| 国产乱人伦精品一区| 999国产精品999久久久久久| 日韩av一级片| 欧美一区二区三区高清视频 | 免费在线观看日韩欧美|