1. Http 协议
- 概念
在 BS 架构中,浏览器通过 Http 协议访问服务器。它是一种应用层协议,运行在 TCP 传输层协议之上。Http 作用是指定数据的传输格式。
默认端口号:80
- Http 协议特点
- Http 协议组成:由请求和响应组成
- 是一种无状态协议,不记录用户访问状态。同一个用户在同一个浏览器上发送多次请求,服务器并不能通过 Http 协议判断是否是同一个用户
- 传输效率相对较高
2. Http 请求
- Http 请求的组成
- 请求行
- 请求的方式
- Get
- Post
- 请求的地址
- 协议和版本
- 1.0 版本:每次请求都会关闭 TCP 连接
- 1.1 版本:普遍使用版本,一次请求多个 web 资源,不会在每次请求结束关闭 TCP 连接
- 请求的方式
- 请求头(不是每次请求都会显示所有的请求头,常用)
Referer
:表示从哪个页面跳转到当前页面来的,得到上一个访问的页面。可以通过该属性设置防盗链,通过判断上一个页面来决定是否允许访问该页面User-Agent
:表示当前客户端浏览器的类型信息Connection
:当前服务器连接状态- keep-alive:保持连接状态
- close:连接关闭
Host
:连接的服务器名字和端口- ...
- 请求体(Get 方法发送数据时没有请求体)
- 本次请求携带的用户数据
- 请求行
- 请求方式的区别| | POST 方式 | GET 方式 |
| ---------------- | ------------------------------------------------------ | --------------------------------------------------------------------------------------- |
| 地址栏 | 参数不会在地址栏上显示出来 | 参数会显示出来,以查询字符串的方式发送数据 |
| 大小 | 理论上没有大小限制,使用流的方式来发送数据。 | 受浏览器限制,通常是 1K |
| 安全性 | POST 数据在请求体中发送,安全性要高一些 | 数据在请求行中发送,安全性要低一些 |
| 缓存 | 不使用缓存 | 如果静态资源在浏览器端已经访问过,下次可能会使用缓存,如果使用缓存状态码是 304 | - HttpServletRequest
-
是 ServletRequest 接口的子接口,代表一个请求对象,用来封装所有从浏览器发送给服务器的数据
-
获取请求行相关方法
String getMethod()
:得到请求的方式String getRequestURI
:得到请求的 URI,只是地址的一部分StringBuffer getRequestURL()
:得到请求的 URL 地址String getProtocol()
:得到请求行中的协议和版本String getRemoteAddr()
:得到客户端的 IP 地址String getContextPath()
:得到当前项目的访问地址String getServletPath()
:得到当前 Servlet 的访问地址
-
获取请求头相关方法
请求头中是由各种键值对组成,通过键得到值
String getHeader(String headName)
:通过键的名字得到对应的值Enumeration<String> getHeaderNames()
:得到所有请求头中键的名字,返回枚举类型
-
获取请求参数
String getParameter(String name)
:通过参数名字得到参数值String[] getParameterValues(String name)
:得到所有同名的参数的值,一般用于复选框Enumeration<String> getParameterNames()
:得到所有的参数名字,返回枚举类型Map<String,String[]> getParameterMap()
:得到所有的参数名和值,封装为 Map 对象
-
BeanUtils 的使用
BeanUtils 是 Apache Commons 组件的成员之一,主要用于简化 JavaBean 封装数据的操作
- 下载地址:http://commons.apache.org/
- 相关 jar 包
commons-beanutils-1.9.3.jar
:BeanUtils 工具的核心包commons-logging-1.2.jar
:用于日志记录功能commons-collections-3.2.2.jar
:公共集合增强包
- 常用方法
public static void populate(Object bean,Map<String,? extends Object> properties)
:将 Map 中所有的键和值封装到 bean 的同名的属性中,如果不同的名字将忽略。
-
参数的乱码问题
- 请求参数产生乱码的原因
Tomcat 中默认对使用 Post 方法提交的参数使用 ISO-8859-1 编码,这是一个欧洲码表,不支持中文
- Post 方式乱码解决方案
request.setCharacterEncoding("utf-8")
,告诉 Tomcat,post 方法使用 utf-8 进行编码- 代码必须放在获取参数之前
- 必须与页面的编码相同
- 关于 Tomcat8.0 中 Get 方法乱码问题
Tomcat8.0 以后,Get 方法参数是在地址栏发送,那么默认就是 utf-8 编码,所以 Get 方法汉字没有乱码问题。只能做字符传递。
- 请求参数产生乱码的原因
-
3. Http 响应
-
响应组成
- 响应行
- 协议和版本
- 状态码(根据状态码可以定位错误)
- 1xx:指示信息,表示请求已接收,继续处理
- 2xx:成功,表示请求已被成功接收
- 3xx:重定向,要完成请求必须进行更进一步的操作
- 4xx:客户端错误,请求有语法错误或请求无法实现
- 5xx:服务端错误,服务器未能实现合法的请求
- 状态信息
- 响应头
- Location:重定向要跳转的地址
- Server:访问的服务器名字
- Content-Encoding:服务器的压缩格式,如果服务器端数据量大时,首先会将数据进行压缩,这就是指压缩的格式,浏览器根据这个格式进行解压
- Content-Length:响应的长度
- Content-Type:服务器发送过来的数据类型和字符集
- Refresh:表示 n 秒以后,跳转到某个页面
- Content-Disposition:内容处理的方式
- attachment:以附件的方式进行下载
- filename:下载时的文件名,汉字将乱码
- Date:服务器响应时间
- expires:浏览器回送的资源存多长时间(0 或-1 表示不缓存)
- 响应体
- 响应的信息
- 响应行
-
常见状态码的具体含义
状态码 含义 200 正确的从服务器得到响应的数据 302 表示页面重定向 304 使用的是本地缓存,并没有从服务器上再次下载网页 404 找不到服务器上指定的资源 405 如果客户端使用 GET/POST 方法提交,而服务器端没有 doGet/doPost 方法,就会出现 405 错误 415 服务器无法处理请求附带的媒体格式(无法识别请求中携带的参数) 500 服务器出现内部错误,一般是 Servlet 中的代码有错误 -
HttpServletResponse
- 设置状态码:
set Status(int status)
- 设置响应头
void setHeader(String name,String value)
:设置响应头,指定名字和值void setContentType(String type)
:设置响应的内容void setCharacterEncoding(String charset)
:设置响应的字符集,设置打印流编码
- 响应体方法
OutputStream getOutputStream()
:字节输出流,用于向浏览器输出图片、视频、压缩包的数据PrintWrite getWrite()
:字符打印输出流,默认指向请求的客户端,用于输出文本数据
- 设置状态码:
-
常见的 ContentType 类型
请求和响应都有该类型
Content-Type
对照表:https://tool.oschina.net/commonstext/html HTML 格式 Content-Type 类型 说明 text/plain 纯文本格式(默认的) text/xml XML 格式 image/gif gif 图片格式 image/jpeg jpg 图片格式 image/png png 图片格式 application/xhtml+xml XHTML 格式 application/xml XML 数据格式 application/json JSON 数据格式 application/pdf pdf 格式 application/msword Word 文档格式 application/octet-stream 二进制流数据(如常见的文件下载) application/x-www-form-urlencoded 表单中默认的 encType,form 表单数据被编码为 key/value 格式发送到服务器(表单默认的提交数据的格式)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于