SpringBoot獲取HttpServletRequest的3種方式總結
更新時間:2023年08月10日 09:33:42 作者:太空眼睛
這篇文章主要給大家介紹了關于SpringBoot獲取HttpServletRequest的3種方式,在Spring boot項目中經(jīng)常要用到Servlet的常用對象如HttpServletRequest request,HttpServletResponse response,HttpSession session,需要的朋友可以參考下
方法一: Controller中增加request參數(shù)
@RestController
public class DemoController {
@RequestMapping("/demo")
public void demo(HttpServletRequest request) {
System.out.println(request.getParameter("hello"));
}
}- 線程安全
- 缺點: 每個方法都需要寫一遍
方法二: 自動注入
@Slf4j
@RequestMapping(path = "/request")
@RestController
public class DemoRequestController {
@Resource
private HttpServletRequest request1;
@RequestMapping(path = "/demo")
public String demo(HttpServletRequest request2) {
log.info("request1: {}", request1.getClass());
log.info("request2: {}", request2.getClass());
return "Hello, world!";
}
}- 線程安全
- 在
Spring中,DemoRequestController的scope是singleton(單例),也就是說在整個web系統(tǒng)中,只有一個DemoRequestController;但是其中注入的request卻是線程安全的,原因在于:使用這種方式,當Bean(本例的DemoRequestController)初始化時,Spring并沒有注入一個request對象,而是注入了一個代理(proxy);當Bean中需要使用request對象時,通過該代理獲取request對象。 - 代理對象中用到了
ThreadLocal, 因此request對象也是線程局部變量;這就保證了request對象的線程安全性。 - 不限于
Controller中,可以在任何地方進行注入 - 注入的對象不限于
request:除了注入request對象,該方法還可以注入其他scope為request或session的對象,如HttpServletResponse對象、HttpSession對象等;并保證線程安全 - 如果
Controller有很多,那么我們需要在每個Controller里面進行注入
方法三: 基類中自動注入
本質與方法二類似
public class BaseController {
@Autowired
protected HttpServletRequest request;
}- 線程安全
- 與方法2相比,避免了在不同的Controller中重復注入request
- 但是java只允許繼承一個基類
方法四: 手動調用
@Slf4j
@RequestMapping(path = "/request")
@RestController
public class DemoRequestController {
@Resource
private HttpServletRequest request1;
@RequestMapping(path = "/demo")
public String demo(HttpServletRequest request2) {
HttpServletRequest request3 = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
log.info("request1: {}", request1.getClass());
log.info("request2: {}", request2.getClass());
log.info("request3: {}", request3.getClass());
return "Hello, world!";
}
}- 線程安全
- 可以在非
Bean中直接獲得 - 缺點與方法一類似
總結
獲取HttpServletRequest共有三種方式
Controller的方法增加HttpServletRequest參數(shù)- 自動注入
建議使用繼承來減少代碼冗余
- 通過
RequestContextHolder.currentRequestAttributes()手動獲取
適合在非Bean中獲取
到此這篇關于SpringBoot獲取HttpServletRequest的3種方式的文章就介紹到這了,更多相關SpringBoot獲取HttpServletRequest內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:
- SpringBoot集成WebServlet出現(xiàn)自定義servlet請求失敗的問題解決方案
- SpringBoot里使用Servlet進行請求的實現(xiàn)示例
- springboot掃描自定義的servlet和filter代碼詳解
- Springboot注入成員變量HttpServletRequest的原理分析
- SpringBoot3.1.2 引入Swagger報錯Type javax.servlet.http.HttpServletRequest not present解決辦法
- 解決IDEA啟動springboot項目報錯java.lang.ClassNotFoundException:?javax.servlet.ServletContext
- Springboot如何添加server.servlet.context-path相關使用
- SpringBoot項目找不到javax.servlet.Filter的問題及解決
- SpringBoot如何切換成其它的嵌入式Servlet容器(Jetty和Undertow)
相關文章
SpringBoot中@PostConstruct 注解的實現(xiàn)
在Spring Boot框架中,?@PostConstruct是一個非常有用的注解,它用于在依賴注入完成后執(zhí)行初始化方法,本文將介紹?@PostConstruct的基本概念、使用場景以及提供詳細的代碼示例,感興趣的可以了解一下2024-09-09
淺談mybatis-plus批量保存異常及效率優(yōu)化
本文主要介紹了mybatis-plus批量保存異常及效率優(yōu)化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-01-01
Java實現(xiàn)字節(jié)數(shù)組轉int(IEEE754標準)的完整指南
在計算機科學中,IEEE 754 標準是浮點數(shù)表示的基石,本文將從 IEEE 754 的底層結構出發(fā),結合 Java 平臺的特性,系統(tǒng)探討字節(jié)數(shù)組到 int 的轉換機制、IEEE 754 的語義映射、字節(jié)序的影響以及工程實踐中的關鍵考量2026-05-05

