【JavaWeb】Http请求与响应

news2024/11/14 13:29:02

文章目录

  • Http 请求与响应
  • 一、Http 请求格式
    • 1、请求行
    • 2、请求头
    • 3、请求体(post请求才有)
  • 二、HttpServletRequest
    • 1、获取 请求行 信息
    • 2、获取 请求头 信息
    • 3、获取 请求参数 信息
  • 三、Http 响应格式
    • 1、响应行
    • 2、响应头
    • 3、响应体(正文)
  • 四、HttpServletResponse
    • 1、设置 响应行 信息
    • 2、设置 响应头 信息
    • 3、设置 响应体 信息
  • 五、附录
    • 1、状态码
    • 2、MIME 扩展名
    • 3、编码问题

Http 请求与响应

一、Http 请求格式

1、请求行

# 格式
		POST:请求方式 请求地址 请求协议/版本号
		GET: 请求方式 请求地址?请求参数 请求协议/版本号 
# 举例
		POST /app/static/login.html HTTP/1.1
		GET  /app/static/login.html?username=jack&password=123 HTTP/1.1

2、请求头

# 格式
		name: value
			name  --> 请求头名称,固定值,可能重复
			value --> 对应的属性值,动态变化

# 常见请求头   
		---------------------------------------------------【了解】
1. Host: localhost:8080          访问的服务器地址(域名+端口)
2. Connection: keep-alive        长连接(http1.1协议)	
3. Upgrade-Insecure-Requests:1   客户端支持https加密协议  
		---------------------------------------------------【重点】
4. Referer: http://baidu.com     上一次访问的地址(用于防盗链...)	
5. User-Agent: xxx			     客户端的系统和浏览器版本(如下所示)
		以谷歌浏览器为例:
			User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) Chrome/63.0 Safari/537.36
		浏览器兼容性:
			服务器会根据用户的浏览器版本,返回响应的数据(相应的浏览器可以解析的数据)

3、请求体(post请求才有)

# 格式
		参数名=参数值&参数名=参数值...

# 例如
		username=jack&password=123...		

# 注意
		get方式没有请求体,post方式才有
		post的请求参数是放在请求体中的

二、HttpServletRequest

  • 原理:Tomcat 支持 HTTP 协议,用户通过浏览器请求服务器时,Tomcat 会将 请求的信息 都封装在 Request 对象中。
  • 作用:开发人员可以通过 Request 对象,获取浏览器发送给服务器的请求信息。
public interface HttpServletRequest extends ServletRequest {...}
ServletRequest  (JavaEE中的接口,兼容大部分协议)
    |
HttpServletRequest (JavaEE中的接口,HTTP协议)

1、获取 请求行 信息

请求行: GET  /test/requestDemo  HTTP/1.1
public interface HttpServletRequest extends ServletRequest {
    // 获取请求方式 --> GET/POST
    String getMethod();

    // 获取URL --> http://localhost:8080/test/requestDemo
    StringBuffer getRequestURL();

    // 获取URI --> /test/requestDemo
    String getRequestURI();

    // 获取协议和版本号 --> HTTP/1.1
    String getProtocol();

    // 获取客户端ip --> 0:0:0:0:0:0:0:1
    String getRemoteAddr();
}

2、获取 请求头 信息

public interface HttpServletRequest extends ServletRequest {
    // 获取指定请求头名称 对应的值(名称不区分大小写)
    String getHeader(String name);

    // 获取所有请求头的名称(Enumeration是Iterator迭代器前身)
    Enumeration<String> getHeaderNames();
}

Tips:如果在浏览器抓包时,看不到某个header,就表示这个header所对应的值是null

3、获取 请求参数 信息

虽然GET请求的参数在请求行,POST请求的参数在请求体,但是都可以使用下列方法来获取请求参数。

public interface HttpServletRequest extends ServletRequest {
    // 获取指定参数名对应的值 --> username - jack
    String getParameter(String name);

    // 获取指定参数名对应的值数组 --> hobby - [drink, perm]
    String[] getParameterValues(String name);

    // 获取所有参数名和对应的值数组,封装到map集合
    Map<String,String[]> getParameterMap();
}

三、Http 响应格式

1、响应行

格式: 协议/版本号 状态码
举例: HTTP/1.1 200

2、响应头

格式: 响应头名称: 响应头的值
举例: Content-Length: 5 (指的是响应体内容长度5个字符)
# 常见响应头
1. Refresh: 
		在指定间隔时间后,跳转到某个页面		
		Refresh:5;http://www.tb.cn
		
2. Content-Type:
		服务器告诉客户端,返回响应体的数据类型和编码方式
		Content-Type:text/html;charset=utf-8
		
3. Location:
		通常与状态码302一起使用,实现重定向操作
		Location:http://www.tb.cn
		
4. Content-Disposition:服务器告诉客户端,以什么样方式打开响应体
		* in-line(默认):浏览器直接打开相应内容,展示给用户
		* attachment;filename=文件名:浏览器以附件的方式保存文件 【文件下载】

3、响应体(正文)

服务器返回的数据,由浏览器解析后展示给用户

四、HttpServletResponse

  • 原理:服务器向浏览器返回请求响应时,Tomcat 会将 响应的信息 都封装在 Response 对象中。
  • 作用:开发人员可以通过 Response 对象,获取服务器返回给浏览器的响应信息。
public interface HttpServletResponse extends ServletResponse {...}
ServletResponse  (JavaEE中的接口,兼容大部分协议)
    |
HttpServletResponse (JavaEE中的接口,HTTP协议)

1、设置 响应行 信息

public interface HttpServletResponse extends ServletResponse {
    // 设置状态码(通常是由tomcat服务器 自动响应 给浏览器,不需要手动设置)
    void setStatus(int sc);
}

2、设置 响应头 信息

public interface HttpServletResponse extends ServletResponse {
    // 设置 header
    void setHeader(String name, String value);
}
// value值可以由多个参数组成,不同参数之间使用分号隔开
response.setHeader("name", "value1;value2");

3、设置 响应体 信息

public interface HttpServletResponse extends ServletResponse {
    // 字符输出流 : 用于向浏览器输出字符数据 (文本)
    PrintWriter getWriter();

    // 字节输出流 : 用于向浏览器输出二进制数据 (文件)
    ServletOutputStream getOutputStream();
}
String responseData = "这是ResponseData";
response.getWriter().print(responseData);

byte[] bytes = responseData.getBytes(StandardCharsets.UTF_8);
response.getOutputStream().write(bytes);

五、附录

1、状态码

在这里插入图片描述

200: 请求和响应都OK

302: 重定向
304: 浏览器从缓存中加载数据(如果是从缓存中获取的数据,状态码是304;否则是200)

400: 请求参数有误
401: 未授权(未登录)
403: 禁止访问(登录了,没有权限)
404: 请求的路径错误或请求的资源不存在
405: 请求的 Method 不正确(如:POST请求写成了GET请求)
406: 请求的 MediaType 不支持
415: 请求的 MediaType 不正确

500: 服务器内部异常    

2、MIME 扩展名

windows 系统文件扩展名MIME 邮件中使用文件扩展名(主类型/子类型)
txttext/plain
htmltext/html
jsonapplication/json
jpgimage/jpeg
avivideo/x-msvideo

具体映射关系 可以在 tomcat安装目录/conf/web.xml 文件查看

3、编码问题

出现编码问题,一般是由于编解码所使用的字符集不一致导致的。(浏览器通常使用)

  • 浏览器:默认使用 UTF-8 编码
  • 服务器:Tomcat 默认使用 ISO-8859-1 编码

对于请求,设置服务器的解码格式。通常在处理请求之前设置编码可以避免乱码问题。

request.setCharacterEncoding("UTF-8");

对于响应,设置浏览器的解码格式(默认由 Tomcat 设置为 ISO-8859-1)

// 服务器告诉浏览器: 以 text/html 的格式 解析 响应体;以 utf-8 的 字符集 解码 响应体
response.setHeader("content-type", "text/html;charset=utf-8"); 
response.setContentType("text/html;charset=UTF-8");

Spring Boot 在启动时,会自动将请求和响应的编码设置为 UTF-8,以确保默认的字符处理不会出现乱码问题。

可以通过配置文件(如 application.propertiesapplication.yml)进行编码设置:

spring:
  web:
    encoding:
      charset: UTF-8
      enabled: true

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

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

相关文章

AI大模型应用开发环境配置

目录 一、工具下载 1、Python官网下载 2、Pycharm官网下载 3、Streamlit官网下载 二、升级PIP &#xff08;一&#xff09;检查PIP版本 &#xff08;二&#xff09;在anaconda Prompt命令窗口输入 三、安装openai组件 四、安装streamlit组件 五、启动streamlit 一、工…

Voi滑板车公司助农扶商,着手打造流量板块

Voi滑板车公司助农扶商&#xff0c;着手打造流量板块。 吉林是粮食大省&#xff0c;是全国优质粳稻主产区&#xff0c;现阶段全省水稻年产量600多万吨&#xff08;商品量400万吨左右&#xff09;&#xff0c;占东北三省一区的24%。巍巍长白山、悠悠松江水&#xff0c;辽阔黑土…

Qt:玩转QPainter序列九(文本,文本框,填充)

前言 继续承接序列八 正文 1. drawImage系列函数 绘制图像 inline void drawImage(const QPoint &p, const QImage &image); 作用: 在指定的点 p 上绘制 QImage 图像。图像的左上角将对齐到 p 点。 inline void drawImage(int x, int y, const QImage &image,…

若依 Vue3的前后端分离系统管理 创建

RuoYi 若依官方网站 |后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|开源后台系统|RuoYi|RuoYi-Vue|RuoYi-Cloud|RuoYi框架|RuoYi开源|RuoYi视频|若依视频|RuoYi开发文档|若依开发文档|Java开源框架|Java|SpringBoot|SrpingBoot2.0…

【JPCS独立出版】第四届电气工程与计算机技术国际学术会议(ICEECT 2024,9月27-29)

第四届电气工程与计算机技术国际学术会议&#xff08;ICEECT2024&#xff09;将于9月27日-29日在哈尔滨举办。 会议主要围绕"电路与系统"、“电气工程材料”、“计算机视觉”、“计算机技术”等专业研究领域展开讨论。旨在为气工程、计算机技术等领域的专家学者及企业…

Java EE

Java EE 包含JavaSE 增加一些新的API 构建一个后端服务 网页->web服务器->java后端 web后端(javaEE)程序需要运行在服务器中的&#xff0c;这样前端才可以访问得到 服务器&#xff1a;是容器&#xff0c;是连接用户和程序之间的中间件 解释1&#xff1a;一款软件&#…

HBase 部署及shell操作

HBase 数据库 一、HBase 概述1.1 HBase 是什么HBase 的特点 二、HBase 模型及架构2.1 HBase 逻辑模型2.2 HBase 数据模型2.3 HBase 物理模型2.3.1 列簇物理模型2.3.2 Rowkey 字段排序2.3.3 Region 存储到不同节点2.3.4 Region 结构 2.4 HBase 基本架构 三、搭建 HBase 分布式集…

【Linux】线程结束

目录 线程安全和重入 死锁 STL中的容器不是线程安全的 线程安全的单例模式 自旋锁 读者写者问题 线程安全和重入 线程安全&#xff1a;多个线程并发执行同一段代码时&#xff0c;不会出现不同的&#xff08;异常的&#xff09;结果&#xff0c;我们就说线程是安全的。常见…

如何学好文件操作,快来看这篇文章(沉淀中)!!!!

文章目录 1. 为什么使用文件&#xff1f;2. 什么是文件&#xff1f;2.1 程序文件2.2 数据文件2.3 文件名 3. ⼆进制文件和文本文件&#xff1f;4. 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭 5. ⽂件的顺序读写5.1 顺序读写函数介绍…

jQuery库

注明&#xff1a;本文参考自&#xff1a;jQuery - 白月黑羽 (byhy.net) jQuery安装 Download jQuery | jQuery下载到本地 ps: script标签中的src属性&#xff1a;表示包含要执行的代码的外部文件位置 <!DOCTYPE html> <html lang"en"><head><s…

unity游戏开放:标记物体 一目了然

Unity游戏开发:标记物体,让开发变得一目了然 “好读书&#xff0c;不求甚解&#xff1b;每有会意&#xff0c;便欣然忘食。” 本文目录&#xff1a; Unity游戏开发 Unity游戏开发:标记物体,让开发变得一目了然前言1. 什么是Tag&#xff1f;2. Unity中如何添加和管理Tag步骤1&am…

vue如何引入element-ui

2.x用element-ui 3.x用element-plus https://blog.csdn.net/weixin_41207479/article/details/127066333 引入element-ui的三种方式

点餐API接口对接的过程中需要注意哪些问题

以下是点餐 API 接口对接的一般步骤&#xff1a; 选择合适的点餐 API 服务提供商&#xff1a;市面上有不少提供点餐 API 的平台。你需要根据自身业务需求、预算、接口的稳定性和性能、技术支持等因素来综合考量选择。注册与申请&#xff1a;在选定 API 服务提供商后&#xff0…

数据响应式

响应式原理 课堂主题 1.利用defineProperty实现数据劫持2.利用ES6中proxy实现数据劫持3.实现数据驱动视图更新&#xff0c;实现数据响应4.发布订阅模式 知识点 defineProperty&#xff1b;Proxy代理数据劫持发布订阅观察者模式与发布订阅数据响应式 defineProperty Objec…

Junit单元测试入门

目录 一、单元测试 1.1 基本概念 1.2 以往测试存在的问题和不足 二、快速入门 2.1 基本步骤 2.2 基本使用示例&#xff08;vscode为例&#xff09; 2.2 断言机制&#xff08;重要&#xff09; 2.3 其它注解 一、单元测试 1.1 基本概念 针对最小单元的测试&#xff0c…

集成电路学习:什么是CPU中央处理器

一、CPU&#xff1a;中央处理器 CPU&#xff0c;全称Central Processing Unit&#xff0c;即中央处理器&#xff0c;是计算机系统的核心部件&#xff0c;负责执行程序指令&#xff0c;完成数据的算术运算或逻辑运算等任务。它是计算机中最重要的硬件之一&#xff0c;相当于计算…

【Qt 事件】—— 详解Qt事件处理

目录 &#xff08;一&#xff09;事件介绍 &#xff08;二&#xff09;事件的处理 &#xff08;三&#xff09;按键事件 3.1 单个按键 3.2 组合按键 &#xff08;四&#xff09;鼠标事件 4.1 鼠标单击事件 4.2 鼠标释放事件 4.3 鼠标双击事件 4.4 鼠标移动事件 4.5…

【Redis】Redis 典型应⽤ - 缓存 (cache)

Redis 典型应⽤ - 缓存 cache 什么是缓存使⽤ Redis 作为缓存缓存的更新策略1) 定期⽣成2) 实时⽣成 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿关于缓存预热 (Cache preheating)关于缓存穿透 (Cache penetration)关于缓存雪崩 (Cache avalanche)关于缓存击穿 (Cache breakdown…

OpenLayers3, 航线动画实现

文章目录 一、前言二、代码实现三、总结 一、前言 本文基于OpenLayers3&#xff0c;实现航线动画的功能。 二、代码实现 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quo…

题解AtCoder ABC 358 F Easiest Maze

一道模拟题。 思路 最短的路线是直接竖着走下来&#xff0c;经过 n n n 个格子&#xff0c;所以 k k k 最小是 n n n。如果想要延长路线&#xff0c;可以采用九转大肠的形状&#xff0c;就像这样&#xff1a; 可以发现&#xff0c;每次向左走之后都必须走回来&#xff0c;…