HTTP协议
一、什么是HTTP协议
http协议是一种网络应用层协议,规定了浏览器与web服务器之间如何通信以及相应的数据包的结构。
-
tcp/ip协议:属于传递层和网络层协议,保证数据可靠的传递。http协议属于应用层协议,需要依赖tcp/ip协议来传递数据包
-
浏览器与web服务器之间如何通信:
- 建立连接
- 发送请求
- 发送响应
- 关闭连接
-
特点:“一次请求,一次连接”
这样做的好处是服务器可以利用有限的连接为尽可能多的请求服务
二、数据包的结构
-
请求数据包
-
请求行(请求方式 请求资源路径 协议和版本)
-
若干消息头
消息头是一些键值对(使用":"分割),浏览器与web服务器之间可以通过消息头来传递一些特定的消息。比如,浏览器可以通过发送“{user-agent”消息头,告诉服务器,浏览器的类型和版本
-
实体内容
只有当请求方式为post时,实体内容才会有数据
请求方式为get时,实体内容为空
-
-
响应数据包
-
状态行(协议和版本 状态码 状态描述)
200:正常
500:系统出错
404:依据请求路径找不到对应的资源
-
若干消息头
服务器也可以发送一些消息头给浏览器,比如:可以发送“content-type”消息头,告诉浏览器,服务器返回的数据类型
-
实体内容
程序的处理结果,浏览器会解析出来,生成相应的页面
-
三、两种请求方式
-
get请求
-
哪一些情况浏览器会发送get请求?
- 在浏览器地址栏直接输入某个地址
- 点击连接
- 表单默认的提交方式
-
get请求的特点
-
会将请求参数添加到请求资源路径的后面,只能提交少量的数据给服务器
请求行只能存放大约2k左右的数据
-
会将请求参数显示在浏览器地址栏,不安全
有些网络设备,比如路由器,会记录包含了请求参数的请求地址
-
-
-
post请求
-
哪一些情况浏览器会发送post请求?
- 将表单的method属性设置为"post"
-
post请求的特点
-
会将请求参数添加到实体内容里面。可以提交大量的数据给服务器
-
不会将请求参数显示在浏览器地址栏,相对安全
http协议并不会对数据加密,所以对于敏感数据需要进行加密处理(需要使用https协议)
-
-
四、如何读取请求参数值
request.getParameter(String paramName);
- 如果请求参数名写错,获得null值
- 表单提交时,如果不填写任何数据,会获得"" -> 空字符串
String[] requset.getParameterValues(String paramName);
-
当有多个请求参数名相同时,使用此方法(多选框)
?interest=cooking&interest=fishing
-
对于多选框和单选框,如果一个都不选,会获得Null值
表单包含有中文参数值,如何处理
-
为什么会有乱码
当提交表单时,浏览器会按照打开该表单所在的页面时的字符集来对中文参数值进行编码。
比如,使用utf-8来编码,而服务器端默认会使用ISO8859-1来解码,所以会产生乱码
-
如何解决
-
get请求
可以修改服务器端的配置
-
post请求
request.setCharacterEncoding(String charset)
-
Servlet输出中文,如何处理
-
为什么会产生乱码
out.println()方法默认会使用“ISO8859-1”来编码(不支持中文)
-
如何处理
- get请求
response.setContentType("text/html;charset=utf-8");
-
post请求
request.setCharacterEncoding(String charset);