HttpServletRequest常用功能简介-笔记

news2025/5/21 0:22:38

javax.servlet.http.HttpServletRequest 是 ServletRequest 接口的子接口,专用于处理 HTTP 协议相关的请求。它提供了访问请求行、请求头、请求参数以及请求属性等方法。

1.请求行(Request Line)

✅ 功能说明

请求行包含客户端发送的 HTTP 请求的基本信息,包括:

  • HTTP 方法:如 GETPOSTPUTDELETE
  • 请求 URI:如 /user/login
  • 协议版本:如 HTTP/1.1
  • 查询字符串:如 ?username=admin
方法说明
getMethod()获取 HTTP 方法(如 GET、POST)。
getRequestURI()获取请求的 URI(如 /app/user)。
getRequestURL()获取完整的 URL(如 http://localhost:8080/app/user?name=Tom)。
getQueryString()获取查询字符串(如 name=Tom&age=25)。
getProtocol()获取协议版本(如 HTTP/1.1)。

🧩 使用场景

  • 根据请求方法决定执行逻辑(如 GET 显示表单,POST 处理提交)
  • 日志记录或访问统计
  • 基于 URI 的路由处理

🔧 示例代码

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String method = request.getMethod(); // 获取 HTTP 方法
    String requestURI = request.getRequestURI(); // 获取请求 URI
    StringBuffer requestURL = request.getRequestURL(); // 获取完整 URL
    String queryString = request.getQueryString(); // 获取查询字符串
    String protocol = request.getProtocol(); // 获取协议版本

    System.out.println("Method: " + method);
    System.out.println("Request URI: " + requestURI);
    System.out.println("Request URL: " + requestURL.toString());
    System.out.println("Query String: " + queryString);
    System.out.println("Protocol: " + protocol);
}

2. 请求头(Request Headers)

✅ 功能说明

请求头包含客户端发送的元数据,如:

  • User-Agent:客户端浏览器信息
  • Accept:客户端可接受的内容类型
  • Content-Type:请求体的格式
  • Referer:请求来源页面
方法说明
getHeader(String name)获取指定头字段的值。
getHeaders(String name)获取所有同名头字段的值(返回 Enumeration<String>)。
getHeaderNames()获取所有头字段名称(返回 Enumeration<String>)。
getContentType()获取 Content-Type 头字段值。
getContentLength()获取 Content-Length 头字段值(以字节为单位)。

🧩 使用场景

  • 根据 User-Agent 判断客户端类型(手机 / PC)
  • 内容协商(如返回 JSON 或 HTML)
  • 安全校验(如检查 Referer 防止跨站攻击)

🔧 示例代码

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    System.out.println("=== Request Headers ===");
    Enumeration<String> headerNames = request.getHeaderNames();
    while (headerNames.hasMoreElements()) {
        String name = headerNames.nextElement();
        String value = request.getHeader(name);
        System.out.println(name + ": " + value);
    }

    // 获取特定头信息
    String userAgent = request.getHeader("User-Agent");
    System.out.println("\nUser-Agent: " + userAgent);
}

3.请求参数(Request Parameters)

✅ 功能说明

请求参数是客户端提交的数据,主要来源于:

  • URL 查询字符串(如 ?username=admin
  • 表单数据(如 <form method="POST"> 提交)
方法说明
getParameter(String name)获取单个参数值(如 username)。
getParameterValues(String name)获取多个参数值(如复选框 hobby,可以选择多个爱好)。
getParameterMap()获取所有参数的键值对(返回 Map<String, String[]>)。
getParameterNames()获取所有参数名称(返回 Enumeration<String>)。

🧩 使用场景

  • 表单处理(登录、注册)
  • 分页、搜索、过滤等查询条件
  • API 接口的参数接收

🔧 示例代码

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //对于 POST 请求,建议在 getParameter() 前,先设置 request.setCharacterEncoding("UTF-8")
    request.setCharacterEncoding("UTF-8"); // 设置编码

    System.out.println("=== Request Parameters ===");
    String username = request.getParameter("username");
    String[] hobbies = request.getParameterValues("hobby");

    System.out.println("Username: " + username);
    System.out.println("Hobbies: " + Arrays.toString(hobbies));

    // 遍历所有参数
    Enumeration<String> paramNames = request.getParameterNames();
    while (paramNames.hasMoreElements()) {
        String name = paramNames.nextElement();
        String value = request.getParameter(name);
        System.out.println(name + ": " + value);
    }
}

4. 请求属性(Request Attributes)

✅ 功能说明

请求属性是服务器内部在处理请求时传递的数据,通常通过 setAttribute() 设置,通过 getAttribute() 获取。

方法说明
setAttribute(String name, Object value)设置请求属性。
getAttribute(String name)获取请求属性。
removeAttribute(String name)移除请求属性。
getAttributeNames()获取所有属性名称(返回 Enumeration<String>)。

🧩 使用场景

  • 在多个 Servlet 或 JSP 页面之间共享数据
  • 从过滤器传递数据到目标资源
  • 传递业务处理结果或错误信息

🔧 示例代码


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 设置属性
    request.setAttribute("message", "Hello from Servlet!");

    // 获取属性
    String message = (String) request.getAttribute("message");
    System.out.println("Message: " + message);

    // 遍历所有属性
    Enumeration<String> attributeNames = request.getAttributeNames();
    while (attributeNames.hasMoreElements()) {
        String attrName = attributeNames.nextElement();
        Object attrValue = request.getAttribute(attrName);
        System.out.println(attrName + ": " + attrValue);
    }

}

5. 完整示例

以下是一个综合示例,展示如何在 doGet 方法中使用上述方法:

@WebServlet("/example")
public class ExampleServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 请求行
        System.out.println("=== Request Line ===");
        System.out.println("Method: " + request.getMethod());
        System.out.println("Request URI: " + request.getRequestURI());
        System.out.println("Request URL: " + request.getRequestURL().toString());
        System.out.println("Query String: " + request.getQueryString());

        // 请求头
        System.out.println("\n=== Request Headers ===");
        Enumeration<String> headers = request.getHeaderNames();
        while (headers.hasMoreElements()) {
            String header = headers.nextElement();
            System.out.println(header + ": " + request.getHeader(header));
        }

        // 请求参数
        System.out.println("\n=== Request Parameters ===");
        Enumeration<String> params = request.getParameterNames();
        while (params.hasMoreElements()) {
            String param = params.nextElement();
            System.out.println(param + ": " + request.getParameter(param));
        }

        // 请求属性
        request.setAttribute("testAttr", "AttributeValue");
        System.out.println("\n=== Request Attributes ===");
        System.out.println("testAttr: " + request.getAttribute("testAttr"));
    }
}

⚠️ 注意事项

  1. 字符编码:对于 POST 请求,建议在 getParameter() 前,先设置 request.setCharacterEncoding("UTF-8")
  2. 文件上传:若需处理文件上传,需使用 Part 或第三方库(如 Apache Commons FileUpload)。
  3. 安全:避免直接信任客户端提交的数据,需进行验证和过滤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2380337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决RAGFlow部署中镜像源拉取的问题

报错提示 Error response from daemon: Get "https://registry-1.docker.io/v2/ ": context deadline exceeded 解决方法 这个原因是因为拉取镜像源失败&#xff0c;可以在/etc/docker/daemon.json文件中添加镜像加速器&#xff0c;例如下面所示 {"registry…

uniapp打包H5,输入网址空白情况

由于客户预算有限&#xff0c;最近写了两个uniapp打包成H5的案例&#xff0c;总结下面注意事项 1. 发行–网站-PCWeb或手机H5按钮&#xff0c;输入名称&#xff0c;网址 点击【发行】&#xff0c;生成文件 把这个给后端&#xff0c;就可以了 为什么空白呢 最重要一点&#xf…

C++(21):fstream的读取和写入

目录 1 ios::out 2 ios::in和is_open 3 put()方法 4 get()方法 4.1 读取单个字符 4.2 读取多个字符 4.3 设置终结符 5 getline() 1 ios::out 打开文件用于写入数据。如果文件不存在&#xff0c;则新建该文件&#xff1b;如果文件原来就存在&#xff0c;则打开时清除…

NAT/代理服务器/内网穿透

目录 一 NAT技术 二 内网穿透/内网打洞 三 代理服务器 一 NAT技术 跨网络传输的时候&#xff0c;私网不能直接访问公网&#xff0c;就引入了NAT能讲私网转换为公网进行访问&#xff0c;主要解决IPv4(2^32)地址不足的问题。 1. NAT原理 当某个内网想访问公网&#xff0c;就必…

Unity 多时间源Timer定时器实战分享:健壮性、高效性、多线程安全与稳定性能全面解析

简介 Timer 是一个 Unity 环境下高效、灵活的定时任务调度系统&#xff0c;支持以下功能&#xff1a; •支持多种时间源&#xff08;游戏时间 / 非缩放时间 / 真实时间&#xff09; •支持一次性延迟执行和重复执行 •提供 ID、回调、目标对象等多种查询和销毁方式 •内建…

【iOS】探索消息流程

探索消息流程 Runtime介绍OC三大核心动态特性动态类型动态绑定动态语言 方法的本质代码转换objc_msgSendSELIMPMethod 父类方法在子类中的实现 消息查找流程开始查找快速查找流程慢速查找流程二分查找方法列表父类缓存查找 动态方法解析动态方法决议实例方法类方法优化 消息转发…

413 Payload Too Large 问题定位

源头 一般是服务器或者nginx 配置导致的 nginx http {client_max_body_size 50m; # 调整为所需大小&#xff08;如 50MB&#xff09;# 其他配置... }nginx 不配置&#xff0c;默认是1M 服务器 spring 不配置也是有默认值的好像也是1M 如果出现413 可以试着修改配置来避…

2025年渗透测试面试题总结-360[实习]安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 1. 自我介绍 2. WAF及其绕过方式 3. IPS/IDS/HIDS 4. 云安全 5. 绕过安骑士/安全狗 6. Gopher扩展…

Ubuntu16.04升级gcc/g++版本方法

0 前言 gcc与g分别是GNU的c和c编译器&#xff0c;Ubuntu16.04默认的gcc和g的版本是5.4.0&#xff0c;在使用一些交叉编译工具链会提示找不到GLIBC_2.27&#xff0c;而GLIBC_2.27又需要gcc 6.2以上版本&#xff0c;因此本文介绍Ubuntu16.04升级gcc/g版本的方法。 1 Ubuntu16.0…

微信小程序van-dialog确认验证失败时阻止对话框的关闭

使用官方(Vant Weapp - 轻量、可靠的小程序 UI 组件库)的before-close&#xff1a; wxml&#xff1a; <van-dialog use-slot title"名称" show"{{ show }}" show-cancel-button bind:cancel"onClose" bind:confirm"getBackInfo"…

OceanBase 的系统变量、配置项和用户变量有何差异

在继续阅读本文之前&#xff0c;大家不妨先思考一下&#xff0c;数据库中“系统变量”、“用户变量”以及“配置项”这三者之间有何不同。如果感到有些模糊&#xff0c;那么本文将是您理清这些概念的好帮手。 很多用户在使用OceanBase数据库中的“配置项”和“系统变量”&#…

【Python】Jupyter指定具体路径

一、右键Jupyter Notebook 右击Jupyter Notebook点击属性 二、修改以下两个地方

RNope:结合 RoPE 和 NoPE 的长文本建模架构

TL;DR 2025 年 Cohere 提出的一种高效且强大的长上下文建模架构——RNope-SWA。通过系统分析注意力模式、位置编码机制与训练策略&#xff0c;该架构不仅在长上下文任务上取得了当前最优的表现&#xff0c;还在短上下文任务和训练/推理效率方面实现了良好平衡。 Paper name …

virtualbox虚拟机中的ubuntu 20.04.6安装新的linux内核5.4.293 | 并增加一个系统调用 | 证书问题如何解决

参考文章&#xff1a;linux添加系统调用【简单易懂】【含32位系统】【含64位系统】_64位 32位 系统调用-CSDN博客 安装新内核 1. 在火狐下载你需要的版本的linux内核压缩包 这里我因为在windows上面下载过&#xff0c;配置过共享文件夹&#xff0c;所以直接复制粘贴通过共享文…

unity UGUI虚线框shader

Shader "Custom/DottedLineShader" {Properties{_MainTex ("Texture", 2D) "white" {}_Color("Color",COLOR) (1,1,1,1)_LineLength("虚线长度",float) 0.08}SubShader{Tags //设置支持UGUI{ "Queue""Tran…

chirpstack v4版本 全流程部署[ubuntu+docker]

背景介绍 由于chirpstackv3 版本使用的是锐米提供的版本,从网络上寻找的资源大多数都是一样的v3版本,是经过别人编译好发布出来的,原本的chirpsatck项目是运行的linxu环境下的,因此我的想法是在linux服务器上部署chirpsatckv4,暂时使用linux上的chirpstack v4版本,目前编译成e…

数字信号处理-大实验1.1

MATLAB仿真实验目录 验证实验&#xff1a;常见离散信号产生和实现验证实验&#xff1a;离散系统的时域分析应用实验&#xff1a;语音信号的基音周期&#xff08;频率&#xff09;测定 目录 一、常见离散信号产生和实现 1.1 实验目的 1.2 实验要求与内容 1.3 实验…

对抗性机器学习:AI模型安全防护新挑战

随着采用对抗性机器学习&#xff08;Adversarial Machine Learning, AML&#xff09;的AI系统融入关键基础设施、医疗健康和自动驾驶技术领域&#xff0c;一场无声的攻防战正在上演——防御方不断强化模型&#xff0c;而攻击者则持续挖掘漏洞。2025年&#xff0c;对抗性机器学习…

[[春秋云境] Privilege仿真场景

文章目录 靶标介绍&#xff1a;知识点卷影拷贝(VSS) 外网任意文件读取Jenkins管理员后台rdp远程登录Gitlab apiToken 内网搭建代理 Oracle RCESeRestorePrivilege提权mimikatzspn卷影拷贝提取SAM 参考文章 靶标介绍&#xff1a; 在这个靶场中&#xff0c;您将扮演一名资深黑客…

Redis学习打卡-Day3-分布式ID生成策略、分布式锁

分布式 ID 当单机 MySQL 已经无法支撑系统的数据量时&#xff0c;就需要进行分库分表&#xff08;推荐 Sharding-JDBC&#xff09;。在分库之后&#xff0c; 数据遍布在不同服务器上的数据库&#xff0c;数据库的自增主键已经没办法满足生成的主键全局唯一了。这个时候就需要生…