Spring Boot当中获取request的三种方式

本文详细介绍HTTP请求处理流程,包括request和response对象的获取方法、常用API详解,以及解决中文乱码等问题,帮助开发者更好地理解并运用这些核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇博客主要记录request相关知识,也是开发当中经常遇到的,感兴趣的跟小编一起学习吧!

一、请求过程

大概的流程:

1、通过请求,然后访问到服务器,像java常用的服务器就是tomcat。

2、服务器收到请求将请求参数、请求内容封装成一个request和response对象,以参数的形式传到我们的java程序。(这个在servlet最底层的接口当中就会看到的,本篇文章不过多说了,后续找时间出一篇sevlet的博客)

3、这时候java程序就有了request和response对象,request当中包含了请求参数、session、请求路径等一些列关于调用接口的相关内容。而response就是我们对于该请求做出的请求响应。响应内容可以是各种参数,或者页面等等,最终封装到response,响应给服务器。

4、服务器将response响应给客户端。

二、获取request的三种方式

2.1、可以封装为静态方法

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

2.2、controller的方法里面

@GetMapping(value = "")
public String doSomething(HttpServletRequest request,HttpServletResponse response) {
    //...
}

2.3、直接注入

@Autowired
private HttpServletRequest request;
 
@Autowired
private HttpServletResponse response;

三、request常用API

3.1、request路径相关

// 获取请求方式: GET
String getMethod()

// 获取虚拟目录(上下文目录):虚拟路径通过在application配置当中可以配置
// 配置:server.servlet.context-path=/aaa
String getContextPath()

// 获取Servlet路径:就是获取的controller当中配置的路径
String getServletPath()

/// 获取请求参数: id=3
// http://localhost:8080/aaa/test?id=3
String getQueryString()

// 获取请求URI:/servletDemo/demo1
// 上下文路径+controller当中配置的路径
String getRequestURI()

// 获取完整请求路径:http://localhost:8080/aaa/test
String getRequestURL()

// 获取协议及版本:HTTP/1.1
String getProtocol()

// 获取客户机的IP地址:192.168.0.0
String getRemoteAddr()

3.2、Header相关

// 获取请求头数据,通过请求头名称获取值
String getHeader(String name)
// 获取所有请求头信息
Enumeration<String> getHeaderNames()

3.3、获取请求体

// 获取流对象-获取字符输入流,只能操作字符数据
BufferedReader getReader()
// 获取流对象-获取字节输入流,既能操作字节也能操作字符
ServletInputStream getInputStream()

3.4、获取参数

// 获取请求参数通用方式(根据参数名称获取参数值) username=zhangsan
String getParameter(String name)
// 获取请求参数名称获取参数值的数组 hobby=xx&hobby=game
String[] getParameters(String name)
// 获取请求参数名称(与获取请求头方法类似)
Enumeration<String> getParameterNames()
// 获取所有参数的Map集合
Map<String,String> getParameterMap()

3.5、中文乱码

中文乱码问题,Tomcat8 已经将GET 请求方式的乱码问题 解决了,但是POST方式的中文乱码问题 依旧存在,需要自行配置
在获取参数之前配置

request.setCharacterEncoding("UTF-8");

3.6、转发

浏览器像服务器发起一次请求,服务器内部实现转发,相当于执行了两个资源之间的操作。

// 通过request对象获取请求转发服务器:
RequestDispatcher getRequestDispatcher(String path);
// 使用==RequestDispatcher对象来进行转发
forward(ServlertRequest request,ServletResponse response);

3.7、共享数据

域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

// 存储数据
setAttribute(String name,Object obj)
// 通过键来获取值
Object getAttribute(String name);
// 通过键移除键对应的值
removeAttribute(String name)

四、response常用API

//设置状态码
response.setStatus(304);

// 设置指定名称响应头的值,下面是导出的时候我们经常要设置的响应头,响应头当中还有文件的名称,也就是通过流下载文件的时候那个文件名称
response.setHeader("Content-Disposition", "attachment;filename=" + zipName);

// 1.字符输出流
PrintWriter getWriter()
// 2.字节输出流(一般导出就是将文件写到字节流,然后响应response)
ServletOutputStream getOutputStream()
// 注意:在同一个Servlet,二种输出流不能同时使用,产生互斥
  
// response提供了专门负责重定向的方法
response.sendRedirect("/项目地址/资源地址");

// 指定服务器响应中文的编码方式
response.setCharacterEncoding("GBK");

// 统一服务器和客户端的编码方式
response.setContentType("text/html;charset=utf-8");
// 导出的时候如果需要直接通过response流导出Excel,需要和前端设置上下文类型,如下:
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

五、常用工具类

5.1、封装的

import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class ServletUtils {

    /**
     * 获取request
     */
    public static HttpServletRequest getRequest() {
        return getRequestAttributes().getRequest();
    }

    /**
     * 获取response
     */
    public static HttpServletResponse getResponse() {
        return getRequestAttributes().getResponse();
    }

    /**
     * 获取session
     */
    public static HttpSession getSession() {
        return getRequest().getSession();
    }

    /**
     * request和response在ServletRequestAttributes类当中
     *
     * @return
     */
    public static ServletRequestAttributes getRequestAttributes() {
        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
        return (ServletRequestAttributes) attributes;
    }

    /**
     * 将字符串渲染到客户端(前后端分离很少会用到)
     *
     * @param response 渲染对象
     * @param string   待渲染的字符串
     * @return null
     */
    public static String renderString(HttpServletResponse response, String string) {
        try {
            response.setStatus(200);
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            response.getWriter().print(string);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取完整的请求路径,包括:域名,端口,上下文访问路径
     * 上传图片的时候需要:服务器路径+上下文访问路径(所以封装了该方法)
     *
     * @return 服务地址
     */
    public static String getUrl() {
        HttpServletRequest request = ServletUtils.getRequest();
        return getDomain(request);
    }

    public static String getDomain(HttpServletRequest request) {
        StringBuffer url = request.getRequestURL();
        String contextPath = request.getServletContext().getContextPath();
        return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString();
    }
}

5.2、Hutool工具类

Hutool工具类是目前最常用的工具类,他的官网写的非常好,并且API也非常好,并且全是中文的,这是重点哈哈。

ServletUtil在线API文档:https://apidoc.gitee.com/dromara/hutool/

API当中包含了:

  • cookie相关
  • 获取请求体
  • header相关
  • 获得MultiPart表单内容
  • 获得请求参数、将参数转换为Bean
  • 以及response相关write操作
<think>好的,我需要帮用户找到在Spring Boot的Controller中获取HttpServletRequest的示例代码。根据用户提供的引用内容,特别是引用[1],里面已经有一个具体的示例。让我仔细看一下引用[1]的内容。 引用[1]中的代码展示了一个HelloController类,其中有一个test1方法,参数中直接使用了HttpServletRequest request。这说明在Spring Boot中,只需在Controller的方法参数里声明HttpServletRequest即可自动注入。用户可能需要知道这种方式是否有效,以及是否需要额外的配置。 接下来,我需要确认这种方式是否标准做法。根据Spring MVC的文档,确实支持在Controller方法参数中注入HttpServletRequest,这是通过HandlerMethodArgumentResolver实现的。所以这个方法不需要其他配置,直接使用即可。 用户可能还关心其他获取方式,比如通过自动注入或上下文持有器,但根据提供的引用,直接参数注入是最简单的。因此,我应该重点展示引用[1]的示例,并说明其工作原理。 另外,需要检查是否有其他引用相关内容。引用[2]和[3]主要涉及应用启动类和DAO层,与当前问题无关,可以忽略。因此,回答应集中在引用[1]的示例上,并确认代码的正确性。 最后,确保回答结构清晰,分步骤说明,并附上代码示例。同时,生成相关问题时要围绕HttpServletRequest的使用和Spring Boot Controller的其他常见操作。</think>### Spring Boot Controller 获取 HttpServletRequest 的示例 在 Spring Boot 中,Controller 层可以通过以下两种常见方式获取 `HttpServletRequest` 对象: --- #### **方法 1:直接作为方法参数注入(推荐)** 在 Controller 方法参数中直接声明 `HttpServletRequest` 类型,Spring 会自动注入当前请求的实例。这是最简单且最常用的方式,代码示例如下: ```java package com.example.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; @RestController @RequestMapping public class HelloController { @GetMapping("/test1") public String test1(HttpServletRequest request) { // 使用 request 对象进行操作,例如获取请求头、参数等 System.out.println("请求方法类型: " + request.getMethod()); return "Request 信息已处理"; } } ``` **说明**: - 通过 `HttpServletRequest request` 参数声明,Spring 会在请求到达时自动注入。 - 可以直接调用 `request` 的方法,如 `getMethod()`、`getHeader()`、`getParameter()` 等[^1]。 --- #### **方法 2:通过自动注入(适用于类内多方法复用)** 如果需要在 Controller 的多个方法中使用 `HttpServletRequest`,可以通过 `@Autowired` 注解自动注入: ```java @RestController @RequestMapping public class HelloController { @Autowired private HttpServletRequest request; // 自动注入 @GetMapping("/test2") public String test2() { String userAgent = request.getHeader("User-Agent"); return "User-Agent: " + userAgent; } } ``` **注意**:此方式需要确保当前线程处于请求上下文中,否则可能引发空指针异常。 --- #### **方法 3:通过上下文持有器(灵活但需谨慎)** 使用 `RequestContextHolder` 静态方法获取当前请求对象: ```java import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @GetMapping("/test3") public String test3() { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); return "请求路径: " + request.getRequestURI(); } ``` **适用场景**:非 Controller 层(如 Service 或工具类)中获取请求对象,但需注意线程安全问题[^1]。 --- ### **代码验证与测试** 1. 启动 Spring Boot 应用(引用[2]中的主类 `DemoApplication.java`)。 2. 访问 `http://localhost:8080/test1`,观察控制台输出的请求信息。 3. 使用 Postman 或浏览器调试工具检查返回值是否符合预期。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪 咖@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值