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。

 

posted @ 2022-01-11 23:11  残城碎梦  阅读(1393)  评论(0编辑  收藏  举报