1:什么是HTTP协议
HTTP是hypertext transfer protocal(超文本传输协议)的简写,是定义在TCP/IP应用层的一种协议。Web客户端向web服务端发送请求并获取响应,在这个过程中就是采用HTTP协议的方式进行数据的传递。HTTP协议的主要特点可以概括如下:
- 支持客服/服务器模式
- 简单快速:客服端向服务端发送请求的时候,只需要传送请求方式+请求路径。由于HTTP请求协议简单,所以HTTP服务器程序规模小,通信速度快。
- 灵活:HTTP允许传送任意类型的数据对象,通过”Content-Type”属性标识当前传送的数据对象类型。
- 面向无连接:无连接的含义就是限制每次连接只处理一个请求。服务器处理请求,当收到客户端的应答后就会断开连接。采用这种方式可以节省时间。
- 无状态:无状态是指协议对事物的处理没有记忆的能力。对应HTTP发送的请求,如果后期需要重新发送相同的请求,则它必须重传。虽然这样比较消耗时间,但却提高了服务器应答的速度。
2:HTTP请求
2.1:HTTP请求包括的内容
客服端连接服务器,向服务器请求某个web资源,这个过程就是客服端向服务器发送了一个HTTP请求。一个HTTP请求主要包括:请求行、多个请求头信息以及实体内容。
2.2:HTTP请求细节-请求方式
HTTP常用的请求方式有get与post。浏览器默认的请求方式为get请求,例如直接在浏览器上通过url访问或者通过超链接跳转,这些都是get请求,可以通过修改表单的提交方式为post。
get请求:在url后面通过”?”方式拼接传递数据项,如果数据项存在多个,通过”&”的方式进行拼接(localhost:8080/ServletDemo?name=’lx’&psw=’123456’)。这种方式会使传递的参数直接显示在浏览器上,同时传递参数参数的大小不能超过1k。
post请求:在请求的实体内容中发送请求参数,请求参数不会出现在浏览器上,同时对于参数传递的大小没有限制,相比get请求是一种比较安全的请求方式。
2.3、HTTP请求的细节——消息头
accept:浏览器通过这个头告诉服务器,它所支持的数据类型
Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式
Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
Host:浏览器通过这个头告诉服务器,想访问哪台主机
If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间
Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链
Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接
3:HTTP响应
3.1:HTTP响应包括的内容
响应代表服务器向客服端发送的数据主要包括:响应状态、若干消息头、以及响应内容
3.2:HTTP响应的细节——状态行
状态行格式: HTTP版本号 状态码 原因叙述 举例:HTTP/1.1 200 OK
状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:
3.3:HTTP响应细节——常用响应头
HTTP响应中的常用响应头(消息头)
Location: 服务器通过这个头,来告诉浏览器跳到哪里
Server:服务器通过这个头,告诉浏览器服务器的型号
Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式
Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度
Content-Language: 服务器通过这个头,告诉浏览器语言环境
Content-Type:服务器通过这个头,告诉浏览器回送数据的类型
Refresh:服务器通过这个头,告诉浏览器定时刷新
Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式处理数据
Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的
Expires: -1 控制浏览器不要缓存
Cache-Control: no-cache
Pragma: no-cache
4:在服务器端设置响应头来控制浏览器的行为
4.1:设置location响应头,实现重定向的功能
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//设置状态码
response.setStatus(302);
//设置响应头
response.setHeader("Location", "/resources/images/18686.jpg");
}
浏览器通过解析响应信息,发现status Code为302,表示当前请求信息已经跳转到一个新的地址,而这个新地址就是location后面对应的URL。
4.2:设置响应头”content-type”的属性,指定浏览浏览器接收的数据类型
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
/**
* 浏览器能接收的数据类型有:
* application/x-ms-application
* image/jpeg,
* application/xaml+xml,
* image/gif,
* image/pjpeg,
* application/x-ms-xbap,
* application/vnd.ms-excel,
* application/vnd.ms-powerpoint,
* application/msword,
*
*/
response.setHeader("content-type", "image/jpg"); //使用content-type响应头指定发送给浏览器的数据类型为image/jpg
InputStream in = this.getServletContext().getResourceAsStream("/resources/images/18686.jpg");
byte[] buff=new byte[1024];
OutputStream out = response.getOutputStream(); //得到输出流
int len=0;
while((len=in.read(buff))>0){ //读取输入流里面的内容存放在缓冲区
out.write(buff, 0, len); //降缓存区的内容输出到浏览器
}
}
发送请求后浏览器的响应信息:
4.3:设置refresh响应头让浏览器定时刷新
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//设置refresh响应头,让浏览器10s调整到www.baidu.com
response.setHeader("refresh", "10;url='http://www.baidu.com'");
response.getWriter().write("liaoxue");
}
对应浏览器的响应信息:
4.4:设置content-dispositon响应头,让浏览器下载文件
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
/**
* 设置content-disposition响应头,让浏览器下载文件
*/
response.setHeader("content-disposition", "attachment;filename=bg.jpg");
InputStream in = this.getServletContext().getResourceAsStream("/resources/images/18686.jpg");
byte[] buff=new byte[1024];
OutputStream out = response.getOutputStream(); //得到输出流
int len=0;
while((len=in.read(buff))>0){ //读取输入流里面的内容存放在缓冲区
out.write(buff, 0, len); //降缓存区的内容输出到浏览器
}
}