Http协议以及解决乱码

Http协议以及乱码

什么是 HTTP 协议

什么是协议?

协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫协议。

所谓 HTTP 协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫 HTTP 协议。

HTTP 协议中的数据又叫报文。

请求的 HTTP 协议

客户端给服务器发送数据叫请求

服务器给客户端回传数据叫响应

请求又分为 GET 请求,和 POST 请求两种

Get请求格式(请求行+请求头)

1.请求行

More Actions请求方式 Get
请求的资源路径[+?+请求参数]
请求的协议的版本号 HTTP/1.1

2.请求头

key : value 组成 不同的键值对,表示不同的

下面内容是Get请求的Http协议内容:

image-20210603154352275

POST 请求格式(请求行+请求头+空行+请求体)

1.请求行

More Actions请求方式 Post
请求的资源路径[+?+请求参数]
请求的协议的版本号 HTTP/1.1

2.请求头

  1. key : value 不同的请求头,有不同的含义

3.空行

4.请求体

请求体 ===>>> 就是发送给服务器的

下面内容是Post请求的Http协议内容:

image-20210603155045894

常用请求头的说明

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.响应体 ---->>> 就是回传给客户端的

image-20210603155810914

常用的响应码说明

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() {

    }
}
posted @ 2021-06-21 16:34  努力&选择  阅读(997)  评论(0)    收藏  举报