Http协议以及解决乱码
Http协议以及乱码
什么是 HTTP 协议
什么是协议?
协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫协议。
所谓 HTTP 协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫 HTTP 协议。
HTTP 协议中的数据又叫报文。
请求的 HTTP 协议
客户端给服务器发送数据叫请求。
服务器给客户端回传数据叫响应。
请求又分为 GET 请求,和 POST 请求两种
Get请求格式(请求行+请求头)
1.请求行
| More Actions请求方式 | Get |
|---|---|
| 请求的资源路径[+?+请求参数] | |
| 请求的协议的版本号 | HTTP/1.1 |
2.请求头
key : value 组成 不同的键值对,表示不同的
下面内容是Get请求的Http协议内容:

POST 请求格式(请求行+请求头+空行+请求体)
1.请求行
| More Actions请求方式 | Post |
|---|---|
| 请求的资源路径[+?+请求参数] | |
| 请求的协议的版本号 | HTTP/1.1 |
2.请求头
- key : value 不同的请求头,有不同的含义
3.空行
4.请求体
请求体 ===>>> 就是发送给服务器的
下面内容是Post请求的Http协议内容:

常用请求头的说明
Accept: 表示客户端可以接收的数据类型
Accpet-Languege: 表示客户端可以接收的语言类型
User-Agent: 表示客户端浏览器的信息
Host: 表示请求时的服务器 ip 和端口
判断哪些是 GET 请求,哪些是 POST
GET 请求有哪些:
1、form 标签 method=get
2、a 标签
3、link 标签引入 css
4、Script 标签引入 js 文件
5、img 标签引入图片
6、iframe 引入 html 页面
7、在浏览器地址栏中输入地址后敲回车
POST 请求有哪些:
8、form 标签 method=pos
响应的 HTTP 协议格式
格式:响应行+响应头+空行+响应体
1、响应行
(1) 响应的协议和版本号
(2) 响应状态码
(3) 响应状态描述符
2、响应头 :
(1) key : value 不同的响应头,有其不同含义
3.空行
4.响应体 ---->>> 就是回传给客户端的

常用的响应码说明
200 表示请求成功
302 表示请求重定向
404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)
500 表示服务器已经收到请求,但是服务器内部错误(代码错误)
MIME 类型说明
MIME 是 HTTP 协议中数据类型。 MIME 的英文全称是"Multipurpose Internet Mail Extensions" 多功能 Internet 邮件扩充服务。MIME 类型的格式是“大类型/小 类型”,并与某一种文件的扩展名相对应。
常见的 MIME 类型:
| 文件 | MIME 类型 |
|---|---|
| 超文本标记语言文本 | .html , .htm text/html |
| 普通文本 | .txt text/plain |
| RTF 文本 | .rtf application/rtf |
| GIF 图形 | .gif image/gif |
| JPEG 图 | .jpeg,.jpg image/jpeg |
| au 声音文 | .au audio/basic |
| MIDI 音乐文件 | mid,.midi audio/midi,audio/x-midi |
| RealAudio 音乐文 | .ra, .ram audio/x-pn-realaudio |
| MPEG 文 | .mpg,.mpeg video/mpeg |
| AVI 文 | .avi video/x-msvideo |
| GZIP 文 | .gz application/x-gzip |
| TAR 文件 | .tar application/x-tar |
乱码问题
doGet 请求的中文乱码解决
// 获取请求参数
String username = req.getParameter("username");
//1 先以 iso8859-1 进行编码
//2 再以 utf-8 进行解码
username = new String(username.getBytes("iso-8859-1"), "UTF-8");
POST 请求的中文乱码解决
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// 设置请求体的字符集为 UTF-8,从而解决 post 请求的中文乱码问题
req.setCharacterEncoding("UTF-8");
System.out.println("-------------doPost------------");
// 获取请求参数
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby = req.getParameterValues("hobby");
System.out.println("用户名:" + username);
System.out.println("密码:" + password);
System.out.println("兴趣爱好:" + Arrays.asList(hobby));
}
响应的乱码解决
解决响应中文乱码方案一(不推荐使用):
// 设置服务器字符集为 UTF-8
resp.setCharacterEncoding("UTF-8");
// 通过响应头,设置浏览器也使用 UTF-8 字符集
resp.setHeader("Content-Type", "text/html; charset=UTF-8");
解决响应中文乱码方案二(推荐):
// 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
// 此方法一定要在获取流对象之前调用才有效
resp.setContentType("text/html; charset=UTF-8")
乱码的统一解决最终方案:自定义过滤器
核心代码:
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
chain.doFilter(request,response);
}
@Override
public void destroy() {
}
}
chain.doFilter(request,response);
}
@Override
public void destroy() {
}
}
浙公网安备 33010602011771号