精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国内精品视频久久| 天天亚洲美女在线视频| 国产精品夜间视频香蕉| 女同久久另类69精品国产| 亚洲一区电影| 欧美午夜宅男影院在线观看| 亚洲欧洲精品一区| 亚洲av综合色区无码一区爱av | 久久精品国产久精国产一老狼| 午夜激情视频网| 超碰aⅴ人人做人人爽欧美| 日本一区二区不卡视频| 懂色av一区二区三区在线播放| 日本中文字幕在线| 亚洲成人精品| 亚洲乱码一区av黑人高潮| 午夜国产一区二区三区| 日本动漫同人动漫在线观看| 国产午夜亚洲精品羞羞网站| 超碰97国产在线| 亚洲视屏在线观看| 伊人久久综合| 久久精品青青大伊人av| 中文字幕丰满孑伦无码专区| 精品中文字幕一区二区三区四区 | 色妞一区二区三区| 黄色免费看视频| 一区在线不卡| 91久久精品网| 国产免费黄色小视频| 国产黄色在线观看| 亚洲国产激情av| 久久久久久久久久久久久久久久av | 国产在线精品播放| 精品不卡在线视频| 日韩视频在线观看免费| 精品伦理一区二区三区| 国产又粗又猛又黄又爽无遮挡| 亚洲小说欧美另类社区| 最近的2019中文字幕免费一页| 国产视频精品视频| 在线高清欧美| 欧美视频在线一区| 国产精品亚洲αv天堂无码| 超碰在线caoporn| 国产精品久久久久精k8| 欧美极品色图| 天天干,夜夜爽| 国产suv精品一区二区883| 成人羞羞国产免费| 夜夜躁狠狠躁日日躁av| 日本伊人色综合网| 国产精品扒开腿做| 男操女视频网站| 日韩成人一区二区三区在线观看| 青青久久av北条麻妃海外网| 国产精品100| 亚洲综合好骚| 全球成人中文在线| 黄色片网站在线免费观看| 亚洲精选久久| 2018国产精品视频| 久久久久久少妇| 一区二区三区导航| 欧美最顶级的aⅴ艳星| 日韩精品在线免费视频| 国产日韩精品视频一区二区三区| 97精品视频在线| 91香蕉在线视频| 99精品热视频只有精品10| 久久久亚洲精品视频| 日本少妇激情舌吻| 性8sex亚洲区入口| 国产精品久久久久久久久久久久| 国产精品午夜一区二区| 美女久久久精品| 国产情人节一区| 亚洲av无码国产精品久久不卡| 成人在线一区二区三区| 国产一区自拍视频| 国产免费永久在线观看| 国产精品女同互慰在线看| 影音先锋欧美资源| 青春草视频在线| 欧美视频在线观看免费网址| 视色视频在线观看| 日韩视频一二区| 亚洲精品美女在线观看播放| 中文字幕网站在线观看| 91精品亚洲| 国产做受高潮69| 波多野结衣mp4| 国产美女一区二区三区| 久久久久久久久久久久久久一区| 高清日韩av电影| 亚洲精品水蜜桃| 国产91对白刺激露脸在线观看| 福利视频一区| 亚洲精品91美女久久久久久久| 亚洲自拍偷拍图| 欧美日韩一区二区高清| 日韩av电影手机在线观看| 国产精品自拍电影| 成人高清视频在线观看| 亚洲电影网站| 狼人综合视频| 欧美一区二区视频观看视频| 亚洲观看黄色网| 9999国产精品| 欧美在线www| www.国产免费| 中文字幕精品—区二区四季| 激情小视频网站| 国产999精品在线观看| 日韩av在线一区二区| 麻豆网址在线观看| 视频在线观看国产精品| 国产欧美日韩在线播放| 日本成人网址| 欧美在线观看视频一区二区三区| 欧美xxxxx精品| 欧美在线网站| 国产精品中文字幕在线| 免费观看成年在线视频网站| 亚洲一区二区三区四区在线观看| 在线观看日本一区二区| 国产区精品区| 91大神福利视频在线| 国产富婆一级全黄大片| 国产精品天美传媒沈樵| 黑人糟蹋人妻hd中文字幕| 懂色av一区二区| 免费不卡欧美自拍视频| 中文字幕一区二区久久人妻| 久久色视频免费观看| 久久久久久免费看| 亚洲日本一区二区三区在线| 日韩中文字幕免费看| 国产情侣免费视频| 欧美中文字幕精品| 精品99久久久久成人网站免费| 丝袜亚洲另类欧美| 国产亚洲情侣一区二区无| 91精品久久久久久粉嫩| 欧美日韩电影一区| 欧美三级视频网站| 久久婷婷亚洲| 欧洲成人一区二区| 中文字幕影音在线| 日韩精品视频观看| 国产成人自拍视频在线| 国产成人免费在线| 日韩久久精品一区二区三区| 97se综合| 国产亚洲精品久久久久久777| 在线视频一区二区三区四区| 久久免费看少妇高潮| 超碰成人免费在线| 欧美调教网站| 日本久久亚洲电影| 搞黄视频免费在线观看| 欧美日韩一本到| 艳妇荡乳欲伦69影片| 国产一区在线精品| 欧美在线观看视频免费| 波多野结衣一区二区三区免费视频| 久久99久久99精品免观看粉嫩| 国产极品999| 亚洲一区二区av电影| yjizz视频| 老鸭窝毛片一区二区三区| 欧洲精品码一区二区三区免费看| 欧美日韩视频免费观看| 中文字幕亚洲一区| 国内精品国产成人国产三级| 五月天一区二区| 人妻熟女aⅴ一区二区三区汇编| 久久只有精品| 国产精品无码乱伦| 粉嫩精品导航导航| 日本免费一区二区三区视频观看| 爱爱爱免费视频在线观看| 欧美精品精品一区| 久久精品视频国产| 国产亚洲综合av| 欧美色图校园春色| 亚洲一区二区三区高清不卡| 亚洲高清精品中出| 亚洲精品一区在线| 国产成人在线视频| 超碰caoporn久久| 亚洲男女自偷自拍图片另类| 国产乱淫片视频| 精品高清一区二区三区| 欧美日韩国产黄色| 成人免费视频caoporn| 日韩一级在线免费观看| 在线国产一区二区| 久久久久久久久久久久久久一区 | 亚洲视频你懂的| 国产女人18毛片水真多18| 三级影片在线观看欧美日韩一区二区| 美女在线免费视频| 国产欧美日韩精品一区二区三区 | 午夜精品福利影院| 成人国产亚洲精品a区天堂华泰| caoporn视频在线| 久久精品国产v日韩v亚洲| 天天干天天舔天天射| 4438成人网| 免费在线观看av的网站| 亚洲一区二区三区影院| 99久久99久久精品免费| 91在线你懂得| 丰满人妻一区二区三区免费视频棣| 日韩电影免费在线看| 免费看黄在线看| 欧美在线亚洲综合一区| 一级日韩一区在线观看| 杨幂一区二区三区免费看视频| av观看久久| 国产成人免费av一区二区午夜| 国产91网红主播在线观看| free性欧美| 欧美大荫蒂xxx| a毛片在线观看| 久久精品99国产精品酒店日本| 九色视频成人自拍| 日韩av网址在线| 秋霞网一区二区| 日韩区在线观看| 国产又粗又黄视频| 欧美色图在线观看| 伊人中文字幕在线观看| 香蕉av福利精品导航| 激情小说中文字幕| 亚洲人成亚洲人成在线观看图片| 国产jizz18女人高潮| 日本一区二区三区dvd视频在线 | 中文字幕第17页| 免费在线观看成人| 激情 小说 亚洲 图片: 伦| 母乳一区在线观看| 日本精品免费在线观看| 国产日韩欧美一区在线| 亚洲美免无码中文字幕在线| 在线成人欧美| 国产淫片免费看| 天堂va蜜桃一区二区三区漫画版 | 国产美女一区二区三区| 亚洲精品中文字幕乱码无线| 极品销魂美女一区二区三区| 岛国av免费在线| 韩国精品在线观看| 日韩精品xxx| www.色综合.com| 欧美精品黑人猛交高潮| 久久影院午夜片一区| 女~淫辱の触手3d动漫| 国产视频在线观看一区二区三区| 亚洲一二三精品| 亚洲日本乱码在线观看| 麻豆成人在线视频| 五月婷婷综合在线| 区一区二在线观看| 欧美日韩性生活| 99久久夜色精品国产亚洲| 日韩一区二区影院| 少妇人妻精品一区二区三区| 亚洲精品日韩在线| av在线天堂| 欧美成人合集magnet| 波多野结衣在线播放| 欧美中文字幕在线| 国内精品伊人| 99久久自偷自偷国产精品不卡| 久久男人av| 日韩久久在线| 欧美三级网页| 无码无遮挡又大又爽又黄的视频| 免费成人av资源网| 4438x全国最大成人| 久久久久久久久久久久久夜| 一本色道久久88| 亚洲自拍偷拍九九九| 丰满少妇xoxoxo视频| 欧美美女激情18p| 人人妻人人澡人人爽精品日本| 亚洲午夜久久久影院| 1区2区3区在线视频| 欧美一级淫片aaaaaaa视频| 欧美videos粗暴| 激情五月综合色婷婷一区二区 | 久久一二三国产| 亚洲伦理一区二区三区| 日韩欧美中文第一页| 国产精品自拍电影| 亚洲欧美综合图区| 污片视频在线免费观看| 国产97在线视频| 成人资源在线| 中文字幕久久综合| 免费国产自线拍一欧美视频| 日本高清免费在线视频| 91麻豆高清视频| 久久国产一级片| 欧美日韩国产123区| 涩涩视频在线观看免费| 久久久97精品| 视频一区在线免费看| 国内视频一区二区| 中文字幕一区二区三区乱码图片| 日本wwww视频| 成人av一区二区三区| 久久久久久久久久97| 日韩人在线观看| 亚洲女人18毛片水真多| 日韩在线视频导航| 都市激情亚洲一区| 国产伦精品一区二区三区四区视频| 99久久精品网站| 国产 porn| 久久久久久久综合| 国产一区二区三区影院| 欧美一级日韩不卡播放免费| 在线免费看黄| 国产精品久久999| 国产亚洲欧美日韩在线观看一区二区 | 天天色影综合网| 欧日韩精品视频| 噜噜噜在线观看播放视频| 97视频在线观看亚洲| 国产精品毛片久久久| 日本黄大片在线观看| 国产一区二区精品在线观看| fc2ppv在线播放| 欧美美女直播网站| 色网站在线看| 国产色视频一区| 91精品国产自产拍在线观看蜜| 久久99999| 中文字幕成人网| 中文字幕无码乱码人妻日韩精品| 色先锋资源久久综合5566| 91国内外精品自在线播放| 色综合电影网| 麻豆成人久久精品二区三区小说| 日本黄色小视频在线观看| 在线观看日韩电影| 成人18在线| 成人激情综合网| 欧美 日韩 国产 一区| wwwww在线观看| 黄色精品一区二区| 欧美精品久久久久久久久久丰满| 日本欧美中文字幕| 欧美少妇xxxx| 欧美视频亚洲图片| 一区二区三区中文免费| 亚洲精品97久久中文字幕无码| 久久久久国产精品一区| 精品中国亚洲| 91看片就是不一样| 国产精品美女久久久久av爽李琼 | 中文字幕日韩精品久久| 国产在线播放一区| 黄色激情视频在线观看| 精品亚洲永久免费精品| 亚洲不卡系列| 国产日韩第一页| 成人免费视频一区| 激情视频网站在线观看| 日韩中文字幕第一页| eeuss鲁片一区二区三区| 国产中文字幕在线免费观看| 久久精品一区二区三区av| 亚洲一区在线观| 久久99国产精品自在自在app| 日本欧美三级| 国产日韩欧美久久| 亚洲国产综合视频在线观看| 欧美女同网站| 亚洲一区二区三区久久 | 国产精品视频1区| 最新精品国产| 亚洲综合色一区| 欧美一级欧美一级在线播放| 草草视频在线| 综合久久国产| 91视频com| 国产精品国产精品国产专区| 久久久久久18| 成人一二三区| 9.1成人看片| 欧美一区二区视频网站| 桃花岛成人影院| 小泽玛利亚av在线| 国产欧美日韩另类视频免费观看| 性一交一乱一色一视频麻豆| 国产精品海角社区在线观看|