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

實戰(zhàn)技巧!Spring Boot 非常有用的五個開發(fā)技巧,請收藏

開發(fā) 開發(fā)工具
Spring提供一個專門處理異步請求的攔截器AsyncWebRequestInterceptor,該接口包含一個在處理異步請求期間被調(diào)用的回調(diào)方法。

環(huán)境:SpringBoot3.2.5

1. 獲取請求/響應(yīng)對象

在編寫Controller中,我們通常可以通過如下的2種方式直接獲取Request和Response對象,如下示例:

@RestController
public class UserController {
  private final HttpServletRequest request ;
  private final HttpServletResponse response ;
  public ContextFilterController(HttpServletRequest request, HttpServletResponse response) {
    this.request = request;
    this.response = response;
  }
}

直接在Controller中注入對象,你也可以在方法參數(shù)中獲取:

@GetMapping
public ResponseEntity<Object> query(HttpServletRequest request, 
  HttpServletResponse response)
  // ...
}

如果你需要在其它組件中獲取該對象,如果通過方法參數(shù)傳遞那就太麻煩了,這時候我們就可以使用如下方式:

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes() ;
HttpServletRequest request = attributes.getRequest() ;
HttpServletResponse response = attributes.getResponse() ;

直接通過ThreadLocal獲取,而這個數(shù)據(jù)的存入則是由DispatcherServlet完成,不過默認(rèn)還有一個RequestContextFilter也會做這個事,但是會被該Servlet覆蓋。

ThreadLocal綁定當(dāng)前線程,如果遇到子線程怎么辦呢?

如果希望在子線程中也能獲取當(dāng)前上下文,那么你需要進(jìn)行如下的配置才可:

@Bean(name = "dispatcherServletRegistration")
DispatcherServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet,
    WebMvcProperties webMvcProperties, ObjectProvider<MultipartConfigElement> multipartConfig) {
  DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(dispatcherServlet,
      webMvcProperties.getServlet().getPath());
  // 設(shè)置從父線程中繼承
  dispatcherServlet.setThreadContextInheritable(true) ;
  // ...
  return registration;
}

測試接口

@GetMapping
public ResponseEntity<Object> context() throws Exception {
  ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes() ;
  HttpServletRequest request = attributes.getRequest() ;
  HttpServletResponse response = attributes.getResponse() ;
  System.err.printf("%s - %s, %s%n", Thread.currentThread().getName(), request, response) ;
  Thread t = new Thread(() -> {
    ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes() ;
    HttpServletRequest req = attr.getRequest() ;
    HttpServletResponse resp = attr.getResponse() ;
    System.err.printf("%s - %s, %s%n", Thread.currentThread().getName(), req, resp) ;
  }, "T1") ;
  t.start() ;
  return ResponseEntity.ok("success") ;
}

控制臺輸出如下

圖片圖片

成功獲取。

警告!如下方式操作,你將收獲一個錯誤

Thread t = new Thread(() -> {
  try {
    TimeUnit.SECONDS.sleep(1) ;
  } catch (Exception e) {
    e.printStackTrace();
  }
  ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes() ;
  HttpServletRequest req = attr.getRequest() ;
  System.err.println(req.getParameter("token")) ;
}, "T1") ;

如上代碼,休眠1s后,在從request中獲取數(shù)據(jù),將拋出如下錯誤

圖片圖片

這是因為主線程已經(jīng)將Request,Response對象回收了。

總結(jié):不建議開啟子線程共享。

2. 異步攔截器

Spring提供一個專門處理異步請求的攔截器AsyncWebRequestInterceptor,該接口包含一個在處理異步請求期間被調(diào)用的回調(diào)方法。

當(dāng)處理器開始處理異步請求時,DispatcherServlet會像平常一樣退出,而不調(diào)用postHandle和afterCompletion方法,因為請求處理的結(jié)果(例如ModelAndView)在當(dāng)前線程中不可用,且處理尚未完成。在這種情況下,會調(diào)用afterConcurrentHandlingStarted(WebRequest)方法,允許實現(xiàn)執(zhí)行諸如清理線程綁定屬性之類的任務(wù)。

當(dāng)異步處理完成時,請求會被分發(fā)到容器中進(jìn)行進(jìn)一步處理。在這個階段,DispatcherServlet會像平常一樣調(diào)用preHandle、postHandle和afterCompletion方法。

public class LogInterceptor implements AsyncWebRequestInterceptor {


  // 請求一開始會執(zhí)行一次
  @Override
  public void preHandle(WebRequest request) throws Exception {
    System.err.printf("AsyncWebRequestInterceptor >>> %s, %s, 開始處理%n", System.currentTimeMillis(), Thread.currentThread().getName()) ;
  }
  // 當(dāng)異步請求結(jié)束時執(zhí)行
  @Override
  public void postHandle(WebRequest request, ModelMap model) throws Exception {
    System.err.printf("AsyncWebRequestInterceptor >>> %s, postHandle%n", Thread.currentThread().getName()) ;
  }
  // 當(dāng)異步請求結(jié)束時執(zhí)行
  @Override
  public void afterCompletion(WebRequest request, Exception ex) throws Exception {
    System.err.printf("AsyncWebRequestInterceptor >>> %s afterCompletion%n", Thread.currentThread().getName()) ;
  }
  // 異步請求開始時執(zhí)行
  @Override
  public void afterConcurrentHandlingStarted(WebRequest request) {
    System.err.printf("AsyncWebRequestInterceptor >>> %s, %s, 異步處理%n", System.currentTimeMillis(), Thread.currentThread().getName()) ;
  }
}

注冊異步攔截器:

@Component
public class WebInterceptorConfig implements WebMvcConfigurer{
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addWebRequestInterceptor(new LogInterceptor()).addPathPatterns("/admin/**") ;
  }
}

下面通過如下異步接口進(jìn)行測試

@GetMapping("/async")
public Callable<String> async() {
  System.err.println("async interface...") ;
  return new Callable<String>() {
    public String call() throws Exception {
      System.err.printf("%s, %s - 執(zhí)行任務(wù)%n", System.currentTimeMillis(), Thread.currentThread().getName()) ;
      TimeUnit.SECONDS.sleep(3) ;
      return "異步數(shù)據(jù)" ;
    }
  };
}

輸出結(jié)果

圖片圖片

等待異步處理完成以后再執(zhí)行preHandle、postHandle和afterCompletion方法。

實際整個異步請求從開始到結(jié)束,preHandle是執(zhí)行了兩回。

3. 獲取當(dāng)前請求相關(guān)信息

Spring MVC在處理一個請求時,會為我們做很多的事,其中會往Request對象設(shè)置一些非常有用的數(shù)據(jù),如下所示:

獲取當(dāng)前的請求路徑

String key = ServletRequestPathUtils.PATH ;
String requestPath = request.getAttribute(key) ;

獲取當(dāng)前請求最佳匹配的路徑(Controller中定義的路徑)

String key = HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE;
String pathPattern = request.getAttribute(key) ;

返回:/params/{type}/{id}

獲取當(dāng)前請求中的路徑參數(shù)值

String key = HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE ;
String pathPattern = request.getAttribute(key) ;

返回:{id=666, type=s0}

4. 類型轉(zhuǎn)換器注冊方式

Spring 本身提供了非常多的類型轉(zhuǎn)換器,絕大多數(shù)情況下我們是不需要再自定義類型轉(zhuǎn)換器的。如果確實需要自定義類型轉(zhuǎn)換器,那么我們通常會通過如下的方法進(jìn)行注冊自定義的轉(zhuǎn)換器:

@Component
public class TypeConvertConfig implements WebMvcConfigurer {


  @Override
  public void addFormatters(FormatterRegistry registry) {
    registry.addConverter(new EnumConverter()) ;
  }
}

感覺是不是有點麻煩。其實我們可以直接定義類型轉(zhuǎn)換器為Bean對象即可,并且支持:GenericConverterConverterPrinterParser類型的轉(zhuǎn)換器。

@Component
public class EnumConverter implements Converter<Sex, Integer> {


  public Integer convert(Sex source) {
    if (source == null) {
      return 0 ;
    }
    return source.getCode() ;
  }
}

注意:這里的自定義轉(zhuǎn)換器并不支持有關(guān)屬性配置的類型轉(zhuǎn)換。

5. 接口不存在時特殊處理

當(dāng)我們訪問的接口不存在時,默認(rèn)輸出如下:

圖片圖片

或者我們也可以在如下位置提供對應(yīng)的404.html或4xx.html頁面

圖片圖片

如上位置添加頁面后,當(dāng)出現(xiàn)404錯誤,將會調(diào)轉(zhuǎn)到該頁面。

其實,我們還可以通過如下全局異常的方式處理404錯誤,默認(rèn)如果出現(xiàn)404錯誤會拋出NoHandlerFoundException異常。

@RestControllerAdvice
public class GlobalExceptionAdvice {


  @ExceptionHandler(NoHandlerFoundException.class)
  public ResponseEntity<Object> noHandlerFount(NoHandlerFoundException e) {
    return ResponseEntity.ok(Map.of("code", -1, "message", "接口不存在")) ;
  }
}

當(dāng)發(fā)生404后,頁面展示:

圖片圖片


責(zé)任編輯:武曉燕 來源: Spring全家桶實戰(zhàn)案例源碼
相關(guān)推薦

2020-10-29 10:00:55

Python函數(shù)文件

2023-02-19 15:22:22

React技巧

2020-06-15 10:29:10

JavaScript開發(fā) 技巧

2009-02-09 11:20:06

Windows7Windows

2025-04-07 02:33:00

項目開發(fā)Spring

2022-06-27 19:01:04

Python應(yīng)用程序數(shù)據(jù)

2025-02-21 16:00:00

SpringBoot代碼開發(fā)

2020-05-28 08:59:40

Python機(jī)器學(xué)習(xí)開發(fā)

2022-05-10 09:33:50

Pandas技巧代碼

2025-08-27 10:10:00

運(yùn)維Linux系統(tǒng)

2023-09-21 12:37:34

IDEA

2009-03-24 14:23:59

PHP類庫PHP開發(fā)PHP

2017-08-02 13:32:18

編程Java程序片段

2011-07-07 17:16:43

PHP

2012-04-17 09:44:08

JavaScript

2015-08-12 11:09:42

開發(fā)者設(shè)計原則

2012-05-25 14:20:08

JavaScript

2018-08-03 10:02:05

Linux命令

2023-06-13 15:15:02

JavaScript前端編程語言

2022-09-02 23:08:04

JavaScript技巧開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號

日本sm极度另类视频| 91麻豆精品国产综合久久久久久| 久久精精品视频| 夜夜春亚洲嫩草影视日日摸夜夜添夜 | 亚洲日本青草视频在线怡红院| 国产裸体写真av一区二区| 伊人情人网综合| 伦av综合一区| 亚洲成人精选| 亚洲欧美制服综合另类| 涩多多在线观看| 黄视频免费在线看| 综合自拍亚洲综合图不卡区| 久久久久久久久久久久久久久久av| 久久99亚洲精品| 欧美日韩精品中文字幕一区二区| 亚洲图片欧美在线| 亚洲国产午夜| www日韩中文字幕在线看| 五月天丁香社区| 色猫猫成人app| 香港成人在线视频| 一区二区冒白浆视频| 无码国产精品一区二区色情男同| 久久精品国产99| 欧美中文字幕第一页| 欧洲第一无人区观看| 国产影视一区| 亚洲精品第一页| 成人av毛片在线观看| 三上悠亚国产精品一区二区三区| 一区二区三区不卡视频在线观看| 午夜欧美性电影| 亚洲人视频在线观看| 国产一区二区按摩在线观看| 国产精品欧美风情| 日本一区二区免费电影| 亚洲免费播放| 欧美激情小视频| 日韩成人毛片视频| 羞羞答答成人影院www| 国产亚洲精品日韩| 成人免费看aa片| 蜜桃一区av| 亚洲成人av在线播放| 超碰91在线播放| www.欧美视频| 欧美一级日韩免费不卡| 不卡中文字幕在线观看| 亚洲精品无播放器在线播放| 欧美主播一区二区三区| 国产无套内射久久久国产| 999福利在线视频| 亚洲一区电影777| 欧美中日韩在线| 色婷婷在线播放| 亚洲激情成人在线| 国产成人艳妇aa视频在线| 亚洲淫性视频| 亚洲精品国久久99热| 久久天天东北熟女毛茸茸| 久cao在线| 亚洲嫩草精品久久| 国产情侣第一页| 欧美hdxxxxx| 香蕉乱码成人久久天堂爱免费| 日韩精品一区二区免费| 手机在线免费观看av| 一区二区免费看| 2019日韩中文字幕mv| 韩国成人二区| 91官网在线免费观看| 91视频免费版污| 日本亚洲欧洲无免费码在线| 91精品国产欧美日韩| 三上悠亚 电影| 国产成人一二片| 国产丝袜一区二区| 天天干天天操天天拍| 外国成人激情视频| 欧美精品在线免费播放| 日韩精品视频免费播放| 老牛嫩草一区二区三区日本| 国产一区红桃视频| 超碰在线播放97| 91小视频在线观看| 亚洲一区二区免费视频软件合集 | 伊人青青综合网站| 久草福利资源在线| 亚洲国产高清一区| 国产精品黄视频| 精品国产九九九| 97se亚洲国产综合自在线| 亚洲看片网站| 6699嫩草久久久精品影院| 色噜噜狠狠一区二区三区果冻| av污在线观看| 久久影视三级福利片| 一区二区三区视频在线| 精品午夜福利在线观看| 天堂在线一区二区| 亚洲一区免费网站| 欧美777四色影视在线| 亚洲人成亚洲人成在线观看图片| 国产精品va无码一区二区| 9.1麻豆精品| 亚洲天堂免费视频| 久久久久久久久精| 日本aⅴ免费视频一区二区三区| 91亚色免费| yw193.com尤物在线| 亚洲大片在线观看| 亚洲国产午夜精品| 国产乱码精品一区二区三区四区| y97精品国产97久久久久久| 你懂的国产视频| 国产伦精品一区二区三区免费| 欧美激情论坛| 福利在线导航136| 在线不卡欧美精品一区二区三区| 麻豆国产精品一区| 激情五月***国产精品| 成人黄色网免费| 国产黄色片在线播放| 性感美女久久精品| 成年人看片网站| 天天做综合网| 国产精品久久久久久久久男| 天天射天天操天天干| 亚洲一区二区精品久久av| 日本高清一区二区视频| 四虎成人av| 国产精品一区二区久久精品| 毛片在线免费| 疯狂蹂躏欧美一区二区精品| 下面一进一出好爽视频| 图片区亚洲欧美小说区| 91精品国产综合久久香蕉的用户体验| 毛片在线免费| 91久久精品网| 三上悠亚影音先锋| 麻豆9191精品国产| 久久久久久久久一区二区| 成人免费高清观看| 亚洲成av人片在线观看香蕉| 免费在线看黄网址| 国产91在线|亚洲| av在线播放天堂| 国产精品毛片av| 91高潮精品免费porn| 特黄视频在线观看| 欧美日韩国产综合视频在线观看中文 | 曰本女人与公拘交酡| 国模大尺度一区二区三区| 99精品视频网站| 成人在线日韩| 欧美片一区二区三区| 成人免费一级视频| 午夜精品久久久久久久99水蜜桃| 亚洲精品无码一区二区| 在线国产精品一区| 久久综合久久久| 欧美自拍电影| 最新的欧美黄色| 国产一区二区小视频| 亚洲欧美电影院| 久久久久国产免费| 亚洲少妇一区| 亚洲7777| 免费一区二区三区在线视频| 国模吧一区二区三区| 色综合888| 欧美三级电影网| 欧美又粗又大又长| www国产精品av| 亚欧美在线观看| 欧美视频导航| 久久久久久久免费| 青草综合视频| 久久人人爽人人爽人人片av高请| 五月激情婷婷网| 欧美揉bbbbb揉bbbbb| wwwav国产| 久久综合九色综合欧美亚洲| 亚洲国产高清av| 激情婷婷久久| 日韩中文字幕av在线| 久久九九精品视频| 2025国产精品视频| 巨大荫蒂视频欧美大片| 亚洲成人激情在线| 日韩精选在线观看| 亚洲一区二区三区爽爽爽爽爽| 成人免费网站黄| 国产一区二区导航在线播放| 男人揉女人奶房视频60分| 欧美熟乱15p| 国产一区二区自拍| 天天综合在线观看| 51色欧美片视频在线观看| 69视频在线| 亚洲精品久久久久久久久| 中文字幕在线播放av| 亚洲大型综合色站| 国产激情无码一区二区三区 | 中文字幕第20页| 国产成人一级电影| 色噜噜狠狠一区二区| 亚洲午夜av| 一区二区免费在线视频| 欧美一区自拍| av一区二区三区免费| 成人在线视频免费看| 91国内揄拍国内精品对白| 免费av在线| 国产亚洲美女久久| 天堂中文在线观看视频| 日韩视频在线观看一区二区| 成人免费一区二区三区| 欧美日韩国产中字| 日本熟伦人妇xxxx| 亚洲精品成人在线| 国产一区在线观看免费| 国产亚洲一本大道中文在线| 日本三级日本三级日本三级极| 久国产精品韩国三级视频| 欧美两根一起进3p做受视频| 亚洲香蕉网站| 亚洲色图都市激情| 日韩系列欧美系列| 视频一区二区在线| 杨幂一区二区三区免费看视频| 国产福利不卡| 一区二区三区视频播放| 亚洲一区二区久久久久久久| 2020国产精品小视频| 国产精品无码专区在线观看| 日本精品裸体写真集在线观看| 欧美影院在线播放| 日韩激情电影免费看| 韩日精品中文字幕| a√中文在线观看| 久久久免费观看| 波多野结衣乳巨码无在线观看| 欧美成人精品三级在线观看 | 欧美军人男男激情gay| 日本黄网免费一区二区精品| 免费观看久久av| 欧美日韩一区二区三区免费| 日韩av三区| 欧美午夜免费| 成人羞羞视频播放网站| 亚洲欧洲免费无码| 亚洲精品a级片| 91传媒免费视频| 亚洲高清久久| 欧美 日韩 国产一区| 久久影院亚洲| 午夜视频在线网站| 久久99精品国产麻豆婷婷| 一级日本黄色片| 成人美女视频在线观看18| 久久精品女同亚洲女同13| 久久这里只有精品视频网| 欧美做受xxxxxⅹ性视频| 国产精品视频第一区| 免费成人美女女在线观看| 亚洲精品成人a在线观看| 精品人妻在线播放| 日韩欧美国产免费播放| 免费看一级视频| 欧美日本在线播放| 性做久久久久久久久久| 日韩不卡在线观看| 国产一区二区影视| 久久中国妇女中文字幕| 91豆花视频在线播放| 日韩免费观看视频| 国产区一区二| 久久偷看各类wc女厕嘘嘘偷窃 | 99久久国产综合精品五月天喷水| 国产精品女主播一区二区三区| 粗暴91大变态调教| 韩国精品一区二区| 无码人妻aⅴ一区二区三区| 欧美国产一区二区| 精品少妇一二三区| 在线观看日韩电影| 亚洲第一天堂在线观看| 亚洲视频日韩精品| 男女在线视频| 国产精品成人一区二区| 亚洲成人五区| 日韩视频在线观看国产| 欧美视频导航| 亚洲欧美视频二区| 99久久久免费精品国产一区二区| 欧美精品日韩在线| 亚洲成年人影院| 夜夜躁狠狠躁日日躁av| 日韩黄在线观看| av片哪里在线观看| 国产精品欧美日韩久久| 欧美美女啪啪| 免费cad大片在线观看| 噜噜噜久久亚洲精品国产品小说| 久久久久久久久久毛片| 久久综合999| 久久久久久久久99| 7777女厕盗摄久久久| 欧美777四色影视在线| 欧美激情按摩在线| 久久精品国产福利| 日本在线播放不卡| 国产亚洲毛片在线| 久草福利在线观看| 中文字幕在线观看一区| 一级黄色在线视频| 亚洲精品美女久久| 密臀av在线| 444亚洲人体| 天天射天天综合网| 黄色手机在线视频| 国产日韩av一区| 日本中文字幕久久| 亚洲精品一区二区在线| 岛国毛片av在线| 粉嫩精品一区二区三区在线观看 | www.av在线.com| 精品国产一区二区三区久久久| 桃色一区二区| 欧美午夜精品久久久久久蜜| 国产一区成人| 污污内射在线观看一区二区少妇| 亚洲综合精品自拍| 国内老熟妇对白hdxxxx| 久久综合亚洲社区| 粉嫩一区二区三区在线观看| 在线观看日韩羞羞视频| 麻豆免费看一区二区三区| 成人国产精品久久久网站| 精品久久久久久中文字幕一区奶水| 丰满人妻熟女aⅴ一区| 欧美日产国产成人免费图片| 国产精选久久| 国产a级黄色大片| 国产91精品精华液一区二区三区 | 欧美蜜桃一区二区三区| 在线免费看a| 成人福利视频网| 97精品中文字幕| 中文字幕avav| 一区二区三区久久| 色噜噜在线播放| 日本成人激情视频| 精品久久精品| 在线能看的av网站| 亚洲免费观看视频| 性欧美一区二区三区| 国内精品久久久久影院优| 日韩极品少妇| 国产情侣av自拍| 中文字幕在线不卡| 国产av无码专区亚洲av麻豆| 国内精品久久久久影院 日本资源| 欧美久久香蕉| www.99在线| 亚洲精品美腿丝袜| 亚洲欧美丝袜中文综合| 国产精品美女主播| 欧美搞黄网站| 少妇户外露出[11p]| 91国产精品成人| 操你啦视频在线| 国产一区二区三区四区五区在线 | 蜜臀av在线| 欧美日韩国产精品一卡| 六月丁香婷婷色狠狠久久| 久热这里只有精品在线| 亚洲嫩模很污视频| 国产精品视频一区视频二区| 农民人伦一区二区三区| 国产欧美一区二区三区在线老狼| 国产一区二区在线播放视频| 孩xxxx性bbbb欧美| 日韩电影二区| 天堂www中文在线资源| 欧美在线观看一区| 中文在线观看免费| 欧美日韩精品一区| 国产成人精品三级| 日本免费在线观看视频| 久久久国产一区二区| 日韩欧美影院| 爱情岛论坛亚洲自拍| 日本韩国精品在线| 欧美aaaaaaa| 中文字幕乱码一区二区三区 | 北条麻妃在线观看视频| 日韩精品视频在线免费观看|