Spring MVC如何獲取HttpServletRequest對象


普通的 Java Web 項目中,我們經常使用 HttpServletRequest 獲取請求參數,請求頭等信息。

到了 Spring MVC 項目,我們通常會使用 Spring 提供的注解獲取參數,如 @RequestParam、@RequestHeader。

不過在某些場景下,我們可能還是想獲取 HttpServletRequest 對象,如獲取請求 IP,獲取請求域名等。這篇我們來學習如何在 Spring MVC 環境下獲取 HttpServletRequest,以及它們的實現方式,以做到知其所以然。

Controller 方法參數

使用注解后的 Spring MVC,controller 方法可以作為 handler 處理請求,如果想獲取 request 對象,只需要在方法中添加 ServletRequest 或 HttpServletRequest 類型參數即可。示例代碼如下:

@RestController
public class TestController {

    @GetMapping("/test")
    public String test(HttpServletRequest request) {
        return "request ip is : " + request.getRemoteHost();
    }

}

利用 controller 方法獲取 HttpServletRequest 參數,如果調用鏈比較長,如 A->B->C->D->E,后面的方法需要使用 HttpServletRequest 參數的話,那么參數需要從 controller 中依次傳遞。這將導致代碼中到處充斥着這個參數,因此僅適用於調用鏈不太長的場景,例如直接在 controller 方法中使用或者在 service 中使用。

靜態方法

除了通過 controller 方法參數獲取 HttpServletRequest 對象,Spring 還允許通過其提供的工具類的靜態方法來獲取 HttpServletRequest。示例如下:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();

靜態方法相比 controller 方法參數來說,更為靈活,不管調用鏈有多深都可以獲取 request。其缺點在於 API 由 Spring 提供,因此增加了學習使用的成本。如果一定要使用的話,在 Spring 的基礎上再次包裝一層,提供一個工具類也是一個不錯的選擇。

直接注入

Spring MVC 環境下,還可以將 HttpServletRequest 當做普通的 bean 注入。代碼如下:

@RestController
public class TestController {

    @Autowired
    private HttpServletRequest request;

    @GetMapping("/test")
    public String test() {
        return "request ip is : " + request.getRemoteHost();
    }

}

通過 @Autorired 的方式引入 HttpServletRequest,可以直接在 bean 中注冊,解決了 controller 方法無法解決調用鏈過長的問題,不過如果在非 bean 中獲取,可能還需要使用靜態方法的方式獲取 request。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM