精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringBoot對Spring MVC都做了哪些事?(三)

開發 架構
要完全替換默認行為,可以實現ErrorController并注冊該類型的bean定義,或者添加ErrorAttributes類型的bean以使用現有機制,但替換內容。

上一篇:《??SpringBoot對Spring MVC都做了哪些事?(二)??》

錯誤處理

默認情況下,Spring Boot提供了一個/error映射,以合理的方式處理所有錯誤,并在servlet容器中注冊為“全局”錯誤頁。對于機器客戶端,它生成一個JSON響應,其中包含錯誤、HTTP狀態和異常消息的詳細信息。對于瀏覽器客戶端,有一個以HTML格式呈現相同數據的“whitelabel”錯誤視圖(要對其進行自定義,請添加一個解決錯誤的視圖)。

如果要自定義默認錯誤處理行為,可以設置許多server.error屬性。

要完全替換默認行為,可以實現ErrorController并注冊該類型的bean定義,或者添加ErrorAttributes類型的bean以使用現有機制,但替換內容。

你還可以定義一個用@ControllerAdvice注釋的類,以自定義JSON格式,以針對特定控制器和/或異常類型返回,如以下示例所示:

@ControllerAdvice(basePackageClasses = AcmeController.class)public class AcmeControllerAdvice extends ResponseEntityExceptionHandler {  @ExceptionHandler(YourException.class)  @ResponseBody  ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) {    HttpStatus status = getStatus(request);    return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status);  }  private HttpStatus getStatus(HttpServletRequest request) {    Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");    if (statusCode == null) {      return HttpStatus.INTERNAL_SERVER_ERROR;    }    return HttpStatus.valueOf(statusCode);  }}

在前面的示例中,如果你的異常是由與AcmeController在同一個包中定義的控制器引發的,那么將使用CustomErrorType POJO的JSON表示,而不是ErrorAttributes表示。

自定義錯誤頁

如果要顯示給定狀態代碼的自定義HTML錯誤頁面,可以將文件添加到/error目錄。錯誤頁面可以是靜態HTML(即,添加到任何靜態資源目錄下),也可以使用模板構建。文件名應為準確的狀態代碼或序列掩碼。

例如,要將404映射到靜態HTML文件,目錄結構如下:

src/ +- main/     +- java/     |   + <source code>     +- resources/         +- public/             +- error/             |   +- 404.html             +- <other public assets>

要使用FreeMarker模板映射所有5xx錯誤,目錄結構如下:

src/ +- main/     +- java/     |   + <source code>     +- resources/         +- templates/             +- error/             |   +- 5xx.ftlh             +- <other templates>

對于更復雜的映射,你還可以添加實現ErrorViewResolver接口的bean,如以下示例所示:

public class MyErrorViewResolver implements ErrorViewResolver {  @Override  public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {    // Use the request or status to optionally return a ModelAndView    return ...  }}

系統默認提供的DefaultErrorViewResolver 在該類中我們可以看到默認從如下幾個位置查找錯誤頁。

public class DefaultErrorViewResolver implements ErrorViewResolver, Ordered {  private static final Map<Series, String> SERIES_VIEWS;  static {    Map<Series, String> views = new EnumMap<>(Series.class);    views.put(Series.CLIENT_ERROR, "4xx");    views.put(Series.SERVER_ERROR, "5xx");    SERIES_VIEWS = Collections.unmodifiableMap(views);}  @Overridepublic ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {    ModelAndView modelAndView = resolve(String.valueOf(status.value()), model);    if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {      // 默認進入這里,根據錯誤碼的序列進行解析視圖      modelAndView = resolve(SERIES_VIEWS.get(status.series()), model);    }    return modelAndView;}  private ModelAndView resolve(String viewName, Map<String, Object> model) {    String errorViewName = "error/" + viewName;    // ...    return resolveResource(errorViewName, model);  }  private ModelAndView resolveResource(String viewName, Map<String, Object> model) {    // 從以下路徑進行查找(路徑都會拼接上error/目錄)    // classpath:/META-INF/resources/    // classpath:/resources/    // classpath:/static/    // classpath:/public/    // 以上路徑都可以通過spring.web.resources.staticLocations進行配置    for (String location : this.resources.getStaticLocations()) {      try {        Resource resource = this.applicationContext.getResource(location);        resource = resource.createRelative(viewName + ".html");        if (resource.exists()) {          return new ModelAndView(new HtmlResourceView(resource), model);        }      }    }    return null;  }}

Spring MVC之外的映射錯誤頁面

對于不使用Spring MVC的應用程序,可以使用ErrorPageRegistrar接口直接注冊ErrorPages。此抽象直接與底層嵌入式servlet容器一起工作,即使你沒有Spring MVC DispatcherServlet,也可以工作。

自定義錯誤頁

@Beanpublic ErrorPageRegistrar errorPageRegistrar(){    return new MyErrorPageRegistrar();}private static class MyErrorPageRegistrar implements ErrorPageRegistrar {    @Override    public void registerErrorPages(ErrorPageRegistry registry) {        registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400"));    }}

工作原理

  • TomcatServletWebServerFactory
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory implements ConfigurableTomcatWebServerFactory, ResourceLoaderAware {  private Set<ErrorPage> errorPages = new LinkedHashSet<>();  public WebServer getWebServer(ServletContextInitializer... initializers) {    prepareContext(tomcat.getHost(), initializers);  }  protected void prepareContext(Host host, ServletContextInitializer[] initializers) {    configureContext(context, initializersToUse);  }  protected void configureContext(Context context, ServletContextInitializer[] initializers) {    TomcatStarter starter = new TomcatStarter(initializers);    // 遍歷所有的ErrorPage對象,將其注冊到Tomcat容器中    for (ErrorPage errorPage : getErrorPages()) {      org.apache.tomcat.util.descriptor.web.ErrorPage tomcatErrorPage = new org.apache.tomcat.util.descriptor.web.ErrorPage();      tomcatErrorPage.setLocation(errorPage.getPath());      tomcatErrorPage.setErrorCode(errorPage.getStatusCode());      tomcatErrorPage.setExceptionType(errorPage.getExceptionName());      context.addErrorPage(tomcatErrorPage);    }  }}
  • 注冊處理器
// 在該自動配置類中,會注冊一個BeanPostProcessorsRegistrar處理器@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,...})public class ServletWebServerFactoryAutoConfiguration {}
  • 注冊錯誤頁注冊器

在上一步中注冊了BeanPostProcessorsRegistrar處理器。在該處理器中會注冊一個ErrorPageRegistrarBeanPostProcessor錯誤頁注冊器的處理器。

public static class BeanPostProcessorsRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware {  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {    // ...    // 注冊ErrorPageRegistrarBeanPostProcessor,又是一個處理器    registerSyntheticBeanIfMissing(registry, "errorPageRegistrarBeanPostProcessor", ErrorPageRegistrarBeanPostProcessor.class, ErrorPageRegistrarBeanPostProcessor::new);  }}
  • 注冊錯誤頁
public class ErrorPageRegistrarBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware {  private ListableBeanFactory beanFactory;  private List<ErrorPageRegistrar> registrars;  @Override  public void setBeanFactory(BeanFactory beanFactory) {    this.beanFactory = (ListableBeanFactory) beanFactory;  }  @Override  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {    // 判斷當前的Bean是不是ErrorPageRegistry對象,在9.2中最后我們提到了TomcatServletWebServerFactory類實現了    // ErrorPageRegistry接口。    if (bean instanceof ErrorPageRegistry) {      // 處理      postProcessBeforeInitialization((ErrorPageRegistry) bean);    }    return bean;  }  @Override  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {    return bean;  }  // registry = TomcatServletWebServerFactory  private void postProcessBeforeInitialization(ErrorPageRegistry registry) {    // 獲取容器中所有ErrorPageRegistrar類型的Bean對象    for (ErrorPageRegistrar registrar : getRegistrars()) {      // 將錯誤頁注冊到TomcatServletWebServerFactory中      registrar.registerErrorPages(registry);    }  }  private Collection<ErrorPageRegistrar> getRegistrars() {    if (this.registrars == null) {      // 從容器中獲取所有ErrorPageRegistrar類型的Bean      // 容器默認是注冊了一個ErrorPageRegistrar      this.registrars = new ArrayList<>(          this.beanFactory.getBeansOfType(ErrorPageRegistrar.class, false, false).values());      this.registrars.sort(AnnotationAwareOrderComparator.INSTANCE);      this.registrars = Collections.unmodifiableList(this.registrars);    }    return this.registrars;  }}

以上的過程就實現了自定義錯誤頁的注冊實現。

跨域支持

跨源資源共享(CORS)是大多數瀏覽器實現的W3C規范,允許您以靈活的方式指定授權何種跨域請求。而不是使用一些不太安全、功能不太強大的方法,如IFRAME或JSONP。

從版本4.2開始,Spring MVC支持CORS。在Spring Boot應用程序中使用帶有@CrossOrigin注釋的控制器方法CORS配置不需要任何特定配置。可以通過使用自定義的addCorsMappings(CorsRegistry)方法注冊WebMVCConfiguer bean來定義全局CORS配置,如下例所示:

@Configuration(proxyBeanMethods = false)public class MyConfiguration {  @Bean  public WebMvcConfigurer corsConfigurer() {    return new WebMvcConfigurer() {      @Override      public void addCorsMappings(CorsRegistry registry) {        registry.addMapping("/api/**");      }    };  }}
責任編輯:姜華 來源: 今日頭條
相關推薦

2022-07-26 07:47:09

SpringMVC

2022-08-02 07:55:28

MVCJersey

2022-07-26 07:47:47

SpringMVC

2021-01-06 08:24:38

人工智能消費領域AI

2020-12-08 09:30:25

CPU內存I

2017-06-26 14:52:45

微軟智能云合作

2017-11-13 15:48:36

架構Spring Clou演進

2017-11-14 09:03:36

Spring Clou架構演進

2014-08-10 14:35:23

2021-08-06 22:45:09

人工智能AI

2017-06-08 09:36:42

京東服務器

2021-07-16 09:58:02

物聯網

2022-05-19 07:01:34

架構

2023-06-07 08:13:46

PixiJSCanvas 庫

2021-01-03 10:37:50

前端開發技術

2019-02-24 23:45:42

5G運營商網絡

2014-11-12 00:01:29

京東

2019-05-14 09:18:18

程序員PythonJava

2020-02-18 08:56:48

疫情運營商網絡

2014-03-26 14:23:36

Microsoft AWindows Azu微軟
點贊
收藏

51CTO技術棧公眾號

性欧美videohd高精| 黄色在线免费观看| 亚洲国产中文在线| 亚州成人在线电影| 日本黑人久久| 久久婷婷中文字幕| 免费在线观看黄色网| 激情五月激情综合网| 欧美国产日产韩国视频| 性高潮久久久久久久| 粉嫩一区二区三区在线观看| 7777kkkk成人观看| 国产女主播av| 人妻无码中文字幕| 日韩精品成人一区二区在线| 久久色在线播放| 天天插天天射天天干| 玖玖精品在线| 精品国产一区二区三区四区 | 色综合天天狠狠| 日本在线观看一区二区三区| 亚洲精品一区二区三区新线路| 久久精品男女| 色综合老司机第九色激情 | 日韩美女毛片| 91精品一区二区三区久久久久久| 久久免费视频3| 中文在线观看免费| 欧美高清在线一区| 国产精品v欧美精品v日韩精品| 色婷婷久久综合中文久久蜜桃av| 亚洲欧洲日本mm| 欧美另类极品videosbest最新版本 | 日韩欧美一区二区一幕| 国产精品黑丝在线播放 | 国产精品青青草| 国产女人爽到高潮a毛片| 日韩一区欧美二区| 国产69久久精品成人| 国产亚洲精品久久久久久打不开| 青青草综合网| 亚洲午夜性刺激影院| 久久福利小视频| 国产66精品| 亚洲精品在线免费播放| 性鲍视频在线观看| 九九九九九九精品任你躁 | 天天干,夜夜爽| 成人综合在线视频| 99在线免费观看视频| 99在线精品视频免费观看20| 美女一区二区视频| 国产精品自拍视频| 国产老女人乱淫免费| 狠狠狠色丁香婷婷综合激情| 国产一区二中文字幕在线看| 在线免费观看视频网站| 久久成人综合网| 成人久久18免费网站图片| 一区二区三区日| 韩国一区二区三区| 91观看网站| 免费观看国产视频| 91免费看片在线观看| 欧美污视频久久久| www.亚洲视频| 亚洲女性喷水在线观看一区| 在线视频不卡一区二区| 欧美区一区二区| 在线观看区一区二| 麻豆传传媒久久久爱| www.日韩| 欧美亚洲一区二区在线| 日韩大片一区二区| 亚洲精品成人一区| 最新中文字幕视频| aaa国产视频| 久久99精品国产| 亚洲自拍另类欧美丝袜| 国产免费黄色网址| 国产xxx精品视频大全| 国产亚洲欧美一区二区三区| 欧美一区二区三区在线播放| 91香蕉在线视频| 99热在线精品观看| 日韩av电影在线网| 亚洲天堂网视频| 国产成人一区二区精品非洲| 精品久久久久久一区| 国内三级在线观看| 亚洲欧洲www| av免费观看大全| 日韩成人亚洲| 欧美一卡在线观看| 免费的av网站| 99国产精品一区二区| 久久免费视频网站| 国产精品无码一区| 懂色av一区二区三区蜜臀| 欧美日韩在线精品| 成人在线观看亚洲| 欧美视频在线看| 91丝袜超薄交口足| 日韩高清成人在线| 国产精品久久久久9999赢消| 国产一区二区三区在线看| 紧身裙女教师波多野结衣| 亚洲一区国产| 亚洲综合国产精品| 国产小视频在线播放| 亚洲综合无码一区二区| 中文久久久久久| 开心激情综合| 久久人人爽人人爽人人片亚洲| 在线观看亚洲天堂| 久久91精品久久久久久秒播| 精品乱码一区| 欧美男男video| 欧美放荡的少妇| 极品人妻videosss人妻| 99精品热视频只有精品10| 5g国产欧美日韩视频| 2019中文字幕在线视频| 欧美视频一二三| 亚洲精品乱码久久| 欧美人与禽猛交乱配视频| 国产精品黄色av| 男人的天堂在线| 婷婷久久综合九色综合绿巨人| 亚洲三级在线观看视频| 欧州一区二区| 日本三级久久久| 婷婷av一区二区三区| 一区二区三区四区视频精品免费 | 激情成人午夜视频| 日韩国产一区久久| 欧美电影免费观看| 欧美久久久久久一卡四| 色婷婷av国产精品| 国产黄色精品视频| 一区不卡字幕| 欧美国产日韩电影| 极品中文字幕一区| 91亚洲国产成人久久精品网站| 国产区在线视频| 日本精品一区二区三区四区的功能| 伊人网综合视频| 1024日韩| aa视频在线免费观看| 男女精品网站| 久99久视频| 蜜桃av.网站在线观看| 亚洲高清色综合| 欧美另类一区二区| 91蜜桃网址入口| 久久美女福利视频| 国产成人ay| 国产日产欧美一区| 日韩人妻无码精品久久久不卡| 日韩精品一区二区三区中文字幕 | sese综合| 国产亚洲精品美女久久久久| 中文在线观看免费高清| 成人激情av| 日韩免费av片| 99精品欧美一区二区三区小说| 国产玉足脚交久久欧美| 欧美三级电影在线| 日本欧美国产在线| 1769在线观看| 欧美一激情一区二区三区| 欧美黄色免费看| 9l国产精品久久久久麻豆| 国产男女无遮挡| 欧美亚洲在线日韩| 91沈先生作品| 国模精品视频| 中文字幕日韩在线播放| 国产wwwxxx| 精品日韩视频在线观看| 欧美激情久久久久久久| 国产精品一区二区在线看| 国产伦精品一区二区三区四区视频_ | 亚洲综合另类小说| av无码av天天av天天爽| 美女视频第一区二区三区免费观看网站| 亚洲一区二区三区四区中文| 中文一区二区三区四区| 欧洲日韩成人av| 黄色片网站在线| 精品国产免费一区二区三区香蕉| 精品国产xxx| 亚洲另类一区二区| 大又大又粗又硬又爽少妇毛片| 毛片一区二区三区| 成品人视频ww入口| 郴州新闻综合频道在线直播| 成人综合av网| 精品三区视频| 性色av一区二区三区红粉影视| 欧美aaaaaaaa| 欧美性极品xxxx娇小| 国产又粗又猛又爽又黄的视频四季| 国产制服丝袜一区| 国产亚洲欧美在线视频| 午夜国产一区二区| 欧美成人蜜桃| 丁香一区二区| 国产精品91久久久| 爱啪啪综合导航| 久久天天躁狠狠躁夜夜躁| 欧美一区二区少妇| 日韩久久免费av| 日韩中文字幕高清| 激情成人在线视频| 欧美日韩免费做爰视频| 国产精品麻豆网站| 一区二区黄色片| 成人黄色网址在线观看| 黄色片免费网址| 蜜桃久久av一区| 国产亚洲综合视频| 黄色日韩精品| 亚洲一区二区三区欧美| 欧美日韩精品一区二区视频| 精品日本一区二区三区| 一区二区网站| 96国产粉嫩美女| 日韩精品人妻中文字幕有码 | 26uuu亚洲国产精品| 成人免费在线| 日韩亚洲欧美中文高清在线| 国模吧精品人体gogo| 国产午夜精品久久久| 日韩中文字幕影院| 精品噜噜噜噜久久久久久久久试看| 91中文字幕在线视频| 欧美影院精品一区| 樱花视频在线免费观看| 一本一本久久a久久精品综合麻豆| 国产一级视频在线观看| 亚洲免费视频中文字幕| 伊人在线视频观看| 亚洲三级免费电影| 农村妇女精品一区二区| 亚洲男同性恋视频| 国产精品成人免费观看| 亚洲精品美腿丝袜| 黄色在线观看免费| 亚洲一区二区视频| 国产亚洲欧美久久久久 | 久久久黄色大片| 一本到三区不卡视频| 6080午夜伦理| 怡红院精品视频| 久久精品免费av| 一区二区三区精品视频| 青青草手机视频在线观看| 一区二区三区精品| 日本熟妇毛耸耸xxxxxx| 欧美日韩国产中文精品字幕自在自线| 日本一区二区欧美| 欧美日韩国产中文字幕| 久久久久久久久久一级| 99国产精品一区二区| 欧美日韩亚洲免费| 北条麻妃国产九九九精品小说| 亚洲欧美国产精品桃花| 久久精品青草| 精品人妻少妇一区二区| 久久性天堂网| www.久久久久久久久久久| 高清日韩电视剧大全免费| 国产人妻人伦精品1国产丝袜| 久久精品欧美一区二区三区麻豆| 操她视频在线观看| 亚洲图片有声小说| 亚洲第一网站在线观看| 777奇米成人网| 少妇高潮久久久| 一本色道久久综合狠狠躁篇的优点| 天天在线视频色| 欧美激情久久久久久| 丁香六月综合| 亚洲精品日产aⅴ| 特黄特色欧美大片| eeuss中文| 久久99伊人| 污污的视频免费观看| 99久久久久久99| 亚洲欧美卡通动漫| 国产xxxx孕妇| 欧美视频在线一区二区三区 | 奇米亚洲午夜久久精品| 天天摸天天舔天天操| 成人涩涩免费视频| 久久久久亚洲AV成人无在| 亚洲一区在线观看免费观看电影高清 | 男男受被啪到高潮自述| 久久久久久久综合| 久久婷婷国产麻豆91| 在线观看视频一区二区| 国产小视频免费观看| 综合136福利视频在线| www.8ⅹ8ⅹ羞羞漫画在线看| 国产精品视频最多的网站| 欧美1区二区| 久久人妻无码一区二区| 日韩不卡一区二区三区| www.免费av| 亚洲一卡二卡三卡四卡无卡久久| 伊人网中文字幕| 日韩av有码在线| 欧美性受ⅹ╳╳╳黑人a性爽| 国产精品视频大全| 一区二区三区日本久久久| 国产www免费| 国产一区二区电影| 日本中文字幕久久| 成人av免费观看| 国产激情av在线| 五月天欧美精品| jizz国产视频| 日韩专区在线播放| 欧美日韩123区| 久久青青草原| 99在线精品免费视频九九视| 欧美日韩一区二区区| 自拍偷拍欧美激情| 一个人看的www日本高清视频| 亚洲天堂av网| 韩国美女久久| 美女亚洲精品| 国产手机视频一区二区| 天天躁日日躁狠狠躁免费麻豆| 亚洲精品欧美在线| 99热这里是精品| 成人444kkkk在线观看| 四虎影视国产精品| 在线观看一区二区三区三州| 免费人成网站在线观看欧美高清| www亚洲色图| 色久优优欧美色久优优| 国产中文字幕在线观看| 日本不卡视频在线播放| 国产成人精品999在线观看| www黄色av| 国产色91在线| 怡春院在线视频| 久久精品国产免费观看| 99tv成人影院| 欧美日韩国产黄色| 色域天天综合网| 欧美孕妇孕交| 国产精品美女999| 99久久精品网站| 久久精品一二三四| 亚洲香肠在线观看| 人人妻人人澡人人爽精品日本| 午夜精品久久久久久久白皮肤| 久久午夜影院| 一本久道综合色婷婷五月| 国产欧美日韩中文久久| 一区二区三区免费在线| 欧美日韩ab片| 群体交乱之放荡娇妻一区二区| 看av免费毛片手机播放| 国产精品免费视频观看| 国产999久久久| 91精品国产亚洲| 欧美视频免费| 超碰人人cao| 欧美性69xxxx肥| 青青青青在线| 国产精品视频入口| 久久久蜜桃一区二区人| 欧美h片在线观看| 亚洲成人网在线| 日本在线中文字幕一区二区三区| 婷婷视频在线播放| gogogo免费视频观看亚洲一| 综合久久中文字幕| 久久99久久久久久久噜噜| 亚洲免费专区| 污污视频在线免费| 欧美日韩国产中字| 国产福利视频在线| 欧美精品与人动性物交免费看| 无码精品人妻一区二区三区影院| 欧美日韩国产成人在线| 一呦二呦三呦国产精品| 午夜不卡福利视频| 精品久久久久久久久久久久久| 99精品老司机免费视频| 国产 高清 精品 在线 a| 日韩精品电影在线观看| 精品视频久久久久| 中文字幕一区二区精品| 美女扒开腿让男人桶爽久久动漫| 97超碰成人在线|