久久精品五月,日韩不卡视频在线观看,国产精品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综合
av不卡免费看| 国产91在线播放精品| 日韩综合精品| 国产粉嫩在线观看| 日韩精品一区二区三区免费观看| 成人日韩精品| 91超碰国产精品| 国模 一区 二区 三区| 欧美不卡在线| 一区二区三区四区精品视频| 日韩精品亚洲aⅴ在线影院| 国产精品视频一区视频二区| 国产一区一一区高清不卡| 久久久精品五月天| 蜜桃av一区二区在线观看| 7777精品| 亚洲女同av| 亚洲欧美日韩在线观看a三区| 日本亚洲最大的色成网站www | 亚洲日产av中文字幕| 蜜桃一区二区三区在线| 欧美aaaaaa午夜精品| 久久黄色影院| 日韩欧美中文字幕在线视频| 精品精品国产三级a∨在线| 亚洲日本网址| 在线精品一区二区| 国产91在线精品| 国产一区二区高清| 精品深夜福利视频| 国模 一区 二区 三区| 在线一区二区三区视频| 国产精品综合色区在线观看| 欧美亚洲国产精品久久| 欧美亚洲tv| 欧美亚洲激情| 久久福利在线| 欧美在线综合| 丁香六月综合| 欧美一区免费| 日韩一级欧洲| 成人av三级| 日韩av成人高清| 欧美亚洲国产精品久久| 国产乱人伦精品一区| re久久精品视频| 精品亚洲成人| 99亚洲精品| 麻豆mv在线观看| 日本aⅴ免费视频一区二区三区| 91精品国产乱码久久久久久久 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产成人久久精品一区二区三区| 免费精品视频| 日韩免费小视频| 国产精品地址| 蜜臀精品久久久久久蜜臀| 日韩在线观看不卡| 国产精品成人3p一区二区三区| 国产模特精品视频久久久久| 日本一区二区高清不卡| 奇米777国产一区国产二区| 欧美特黄一级| 色偷偷色偷偷色偷偷在线视频| 国产欧美88| 婷婷成人av| 视频一区视频二区中文字幕| 国产精品久久久久久久免费观看 | 欧美午夜不卡| 日韩欧美中文| 国产中文字幕一区二区三区| 欧美视频二区| 青草国产精品| 欧美在线精品一区| 在线看片一区| 男人操女人的视频在线观看欧美| 久久人人99| 久久精品动漫| 韩国精品主播一区二区在线观看| 国产精久久久| 国产精品任我爽爆在线播放 | 国产精品日韩精品中文字幕| 亚洲精品日韩久久| 免费一级片91| 蜜芽一区二区三区| 亚洲免费观看高清完整版在线观| 国产高清久久| 国产精品嫩草99av在线| 亚洲视频www| re久久精品视频| 日韩亚洲国产欧美| 玖玖玖国产精品| 日韩专区一卡二卡| 免费观看久久久4p| 免费看日韩精品| 中文一区一区三区免费在线观| 日韩午夜黄色| 免费不卡在线观看| 日韩av一区二区三区| 日韩国产精品久久久| 欧美日韩一区自拍| 欧美91在线| 深夜福利视频一区二区| 在线观看精品| 在线日韩电影| 水蜜桃久久夜色精品一区的特点| 美女网站久久| **爰片久久毛片| 精品丝袜久久| 四虎4545www国产精品 | 免费国产自久久久久三四区久久 | 精品欧美一区二区三区在线观看| 91视频久久| 国产在线日韩| 久久国产精品久久w女人spa| 亚洲有吗中文字幕| 欧美天堂在线| 成人福利av| 欧美一区=区| 久久av免费| 日本在线精品| 亚洲在线久久| 精品国产乱码久久久| 欧美成人久久| 日韩中文字幕一区二区高清99| 国产精品视频3p| 久久婷婷激情| 免费日本视频一区| 免费在线观看一区| 久久国产主播| 日韩精品一页| 91免费精品| 蜜桃久久精品一区二区| 国产亚洲一区二区三区不卡| 亚洲黄色免费看| 亚洲精品字幕| 精精国产xxxx视频在线野外| 伊人久久亚洲| 色乱码一区二区三区网站| 亚洲欧美日韩视频二区| 另类欧美日韩国产在线| 亚州av乱码久久精品蜜桃| 中文字幕一区二区三区在线视频| 国产精品久久久久久久久免费高清 | 亚久久调教视频| 老司机精品视频网| 亚洲免费黄色| 免费在线成人| 国产偷自视频区视频一区二区| 日韩精品一级| 日韩国产在线| 91精品在线免费视频| 日韩高清不卡| 国产精品久久国产愉拍| 中文一区二区| 天堂√中文最新版在线| 日韩精品视频网站| 国产在线不卡| 国产成人精品999在线观看| 亚洲狼人精品一区二区三区| 日本不良网站在线观看| 日本一区免费网站| 免费不卡中文字幕在线| 精品三级av| 亚洲精品自拍| 精品在线播放| 国产一区福利| 青草国产精品| 男人的天堂久久精品| 99成人超碰| 吉吉日韩欧美| 国产精品久久久久av蜜臀| 最新国产精品| 99在线|亚洲一区二区| 欧美成人a交片免费看| 国产欧美一区二区三区精品观看| 99国产精品| 精品成人免费一区二区在线播放| 国产精品一二| 男人的天堂亚洲一区| 欧美成人高清| 久久久精品久久久久久96| 国精品产品一区| 久久精品国产成人一区二区三区| 91九色综合| 青草av.久久免费一区| 综合一区二区三区| 日韩中文字幕av电影| 亚洲欧美日韩高清在线| 日韩福利一区| 精品三级久久久| 国产亚洲欧美日韩精品一区二区三区| 美女网站久久| 男女激情视频一区| 欧美日韩视频一区二区三区| 久久精品影视| 久久人人97超碰国产公开结果| 日本а中文在线天堂| 日本在线啊啊| 久久激情网站|