杰瑞科技汇

java 获取request对象

在 Java Web 开发中,获取 HttpServletRequest 对象是处理 HTTP 请求的基础,根据不同的开发框架和场景,获取方式有所不同,以下是几种常见的情况:


原生 Servlet 环境(无框架)

在标准的 Java Servlet 开发中,HttpServletRequest 作为 service() 方法的参数直接传入:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        // 直接使用 request 对象
        String userAgent = request.getHeader("User-Agent");
        System.out.println("User-Agent: " + userAgent);
    }
}

Spring MVC 框架

在 Spring MVC 中,HttpServletRequest 可以通过以下方式获取:

(1) 方法参数注入(推荐)

直接在 Controller 方法中声明 HttpServletRequest 参数,Spring 会自动注入:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class MyController {
    @GetMapping("/example")
    public String example(HttpServletRequest request) {
        String sessionId = request.getSession().getId();
        return "Session ID: " + sessionId;
    }
}

(2) 通过 @Autowired 注入

如果需要在非 Controller 类(如 Service 层)中使用,可以通过 @Autowired 注入 HttpServletRequest 的代理对象:

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MyService {
    // 获取当前请求的 HttpServletRequest
    public HttpServletRequest getCurrentRequest() {
        return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
    }
    // 或直接注入(需要配置 WebApplicationContext)
    @Autowired
    private HttpServletRequest request;
}

Spring Boot 环境

Spring Boot 完全兼容 Spring MVC 的方式,因此上述方法同样适用,Spring Boot 还支持通过 @RestControllerAdvice 全局捕获请求:

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
import javax.servlet.http.HttpServletRequest;
@ControllerAdvice
public class GlobalRequestHandler {
    @ModelAttribute("request")
    public HttpServletRequest getRequest(HttpServletRequest request) {
        return request;
    }
}

其他框架

(1) Jakarta EE(Java EE 8+)

与原生 Servlet 方式相同,直接通过方法参数获取:

import jakarta.servlet.http.HttpServletRequest;
public class MyResource {
    public void handleRequest(HttpServletRequest request) {
        // 使用 request
    }
}

(2) JAX-RS(如 Jersey)

通过 Context 注入:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.servlet.http.HttpServletRequest;
@Path("/api")
public class MyResource {
    @GET
    public String get(@Context HttpServletRequest request) {
        return "Request URI: " + request.getRequestURI();
    }
}

注意事项

  1. 线程安全HttpServletRequest 是线程绑定的,不要跨线程传递。
  2. 作用域:仅在请求处理期间有效,请求结束后即失效。
  3. 性能:直接注入比通过 RequestContextHolder 获取更高效。

场景 获取方式
原生 Servlet 方法参数(service(HttpServletRequest request)
Spring MVC/Boot 方法参数注入或 @Autowired 注入
Jakarta EE 方法参数或 @Context 注入(JAX-RS)
非 Controller 类 通过 RequestContextHolder.currentRequestAttributes() 获取

根据你的开发框架选择最合适的方式即可。

分享:
扫描分享到社交APP
上一篇
下一篇