javaweb-day04-6&7(javaWeb开发入门 - HTTP协议2)

HTTP请求

  • 客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。一个完整的HTTP请求包括如下内容:
    •   一个请求行、若干消息头、以及请求体(发送表单的时候会提交点数据给服务器,数据一般作为请求体来发给服务器),如下所示 :




HTTP请求的细节——请求行

  • 请求行中的GET称之为请求方式,请求方式有:
    • POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT
    • 常用的有: GET、 POST
    • 用户如没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。
  • 不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:
    • 如请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:
    • GET /mail/1.html?name=abc&password=xyzHTTP/1.1
    • GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。
    • 如请求方式为POST方式,则可以在请求体中向服务器发送数据,Post方式的特点:传送的数据量无限制。


HTTP请求的细节——消息头

  • 用于HTTP请求中的常用请求消息头
    • Accept:text/html,image/*    浏览器通过这个头告诉服务器,它所支持的数据类型
    • Accept-Charset: ISO-8859-1    浏览器通过这个头告诉服务器,它支持哪种字符集
    • Accept-Encoding: gzip,compress    浏览器通过这个头告诉服务器,支持的压缩格式
    • Accept-Language: en-us,zh-cn     浏览器通过这个头告诉服务器,它的语言环境
    • Host:www.it315.org:80    浏览器通过这个头告诉服务器,想访问哪台主机
    • If-Modified-Since: Tue,11 Jul 2000 18:23:51 GMT    浏览器通过这个头告诉服务器,缓存数据的时间
    • Referer:http://www.it315.org/index.jsp     浏览器通过这个头告诉服务器,客户机是哪个页面来的  防盗链
    • User-Agent:Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
    • Cookie
    • Connection:close/Keep-Alive     浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接
    • Date: Tue,11 Jul 2000 18:23:51 GMT


HTTP响应

  • 一个HTTP响应代表服务器向客户端回送的数据,它包括:
    •  一个状态行、若干消息头、以及实体内容(回送给浏览器的响应数据) 。



HTTP响应的细节——状态行

  • 状态行
    • 格式: HTTP版本号 状态码 原因叙述<CRLF>
      • 举例:HTTP/1.1   200  OK
    • 状态码:用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:
      • 常用的状态码:200(一切ok)、302(我没有,你找别人)、304(找你的缓存去吧)、404(没有找到,你敲错了地址)、500(我出错了)



HTTP响应细节——常用响应头

  • HTTP响应中的常用响应头
    • Location: http://www.it315.org/index.jsp     配合响应状态码302用的,服务器通过这个头,来告诉浏览器具体跳到哪里
    • Server:apache tomcat     服务器通过这个头,告诉浏览器我当前用的服务器的版本号
    • Content-Encoding: gzip     服务器通过这个头,告诉浏览器,我这个数据采用的是什么压缩格式
    • Content-Length: 80     服务器通过这个头,告诉浏览器回送数据的长度
    • Content-Language: zh-cn     服务器通过这个头,告诉浏览器语言环境
    • Content-Type: text/html; charset=GB2312     服务器通过这个头,告诉浏览器回送数据的类型
    • Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT
    • Refresh: 1;url=http://www.it315.org     服务器通过这个头,告诉浏览器定时刷新
    • Content-Disposition: attachment;filename=aaa.zip     服务器通过这个头,告诉浏览器以下载方式打开
    • Transfer-Encoding: chunked      服务器通过这个头,告诉浏览器数据是以分块方式回送的
    • Set-Cookie:SS=Q0=5Lb_nQ; path=/search    以后有专门章节会讲Cookie
    • 控制浏览器不要缓存的响应消息头,下面三个组合使用:
      • Expires: -1                               控制浏览器不要缓存
      • Cache-Control:no-cache      控制浏览器不要缓存
      • Pragma:no-cache                 控制浏览器不要缓存
    • Connection:close/Keep-Alive                    告诉浏览器,保持连接还是断开
    • Date: Tue,11 Jul 2000 18:23:51 GMT      服务器回送数据的日期

演示响应消息头:

演示一:状态码302,响应消息头Location

package cn.mengmei;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		test1(request,response);
	
	}

	//Location: http://www.it315.org/index.jsp  配合响应状态码302用的,服务器通过这个头,来告诉浏览器具体跳到哪里
	//这个就是传说中的请求重定向。
	public void test1(HttpServletRequest request, HttpServletResponse response) {
		response.setStatus(302);
		response.setHeader("Location", "/myday04/1.html");  //服务器调用这个资源,‘/’代表webapps
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}

}

放在WebRoot下的1.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>1.html</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
    This is my mengmei's HTML page. <br>
  </body>
</html>
演示结果:

访问:http:localhost:8080/myday04/servlet/ServletDemo1



演示二:响应消息头Content-Encoding、Content-Length

package cn.mengmei;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		test2(request,response);
	
	}
	
	//Content-Encoding: gzip   服务器通过这个头,告诉浏览器,我这个数据采用的是什么压缩格式
	public void test2(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String data = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
		System.out.println("原始数据大小:"+data.getBytes().length);
		
		//底层流:java.io.ByteArrayOutputStream 把数据写到字节数组里面去(内存里)   如:FileOutputStream 把数据写到文件里
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		
		//java.util.zip.GZIPOutputStream 压缩流,调用它的write方法,方法内部就会自动把数据压缩了然后写到底层流里面去。
		GZIPOutputStream gout = new GZIPOutputStream(bout);
		gout.write(data.getBytes());
		gout.close();  //只有关闭此流,它才会真正的把数据写到底层流里面去。
		
		
		//将压缩后的内存中的字节数组取出,复制到一个新byte数组里。
		byte[] g = bout.toByteArray();
		//把压缩数据写给浏览器
		response.setHeader("Content-Encoding", "gzip");
		response.setHeader("Content-Length", g.length+"");
		response.getOutputStream().write(g);
	}
	

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}

}
演示结果:

访问:http:localhost:8080/myday04/servlet/ServletDemo1

  • 控制台打印:原始数据大小:1066

  • 第一次试验:数据为:String data = "abcdefghijklmnopqrstuvwxyz"; 原始数据大小为26,压缩后的数据大小为46,压缩后反而变大了?
    • 因为原始数据太小了,出不来效果。
  • 第二次试验:加大了数据量:String data = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"; 原始数据大小为1066,压缩后的数据大小为57,压缩率为18%。
    • 一个网页的大小肯定不只1K。 数据越大,压缩效果越好。 电信部门向网站运营商是按出口流量收费的,你这个月出去多少数据就收多少费,所以大型网站运营商为了省钱一定要压缩数据再打出去。



演示三:响应消息头Content-Type: text/html;charset=GB2312

  • 文件 apache-tomcat-7.0.42\conf\web.xml 里面配置了各种类型的文件在Content-Type头字段里该怎么写,例如:你要发送的数据是jpg类型的,那么就在文件里Ctrl+F搜索<jpg
    • 就会搜索到:    <mime-mapping>
    •         <extension>jpg</extension>
    •          <mime-type>image/jpeg</mime-type>
    •      </mime-mapping>
  • 用红色标出的,就可以写在Content-Type头字段里。
package cn.mengmei;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.GZIPOutputStream;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		test3(request,response);	
		
	}
	
	//Content-Type: text/html; charset=GB2312     服务器通过这个头,告诉浏览器回送数据的类型
	public void test3(HttpServletRequest request, HttpServletResponse response) throws IOException {
		//在文件 apache-tomcat-7.0.42\conf\web.xml 里面查类型该怎么写。
		response.setHeader("Content-Type", "image/jpeg");
		
		InputStream in = this.getServletContext().getResourceAsStream("/2.jpg"); //java程序调用这个资源,‘/’代表WebRoot
		byte[] buffer = new byte[1024];
		int len = 0;
		
		ServletOutputStream out = response.getOutputStream();
		while((len=in.read(buffer))>0){
			out.write(buffer,0,len);
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}

}
放在WebRoot下的图片2.jpg


演示结果:

访问:http:localhost:8080/myday04/servlet/ServletDemo1




演示四:响应消息头Refresh: 1;url=http://www.it315.org
package cn.mengmei;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.GZIPOutputStream;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		test4(request,response);
	
	}
	
	//Refresh: 1;url=http://www.it315.org  服务器通过这个头,告诉浏览器定时刷新
	//用在聊天室,随时刷新消息
	public void test4(HttpServletRequest request, HttpServletResponse response) throws IOException {
		response.setHeader("Refresh", "5;url=http://www.baidu.com");
		response.getWriter().write("abcde");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}

}

演示结果:

访问:http:localhost:8080/myday04/servlet/ServletDemo1



演示五:响应消息头Content-Disposition: attachment;filename=aaa.zip
package cn.mengmei;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.GZIPOutputStream;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		test5(request,response);

	}
	
	//Content-Disposition: attachment;filename=aaa.zip  服务器通过这个头,告诉浏览器以下载方式打开
	public void test5(HttpServletRequest request, HttpServletResponse response) throws IOException {
		response.setHeader("Content-Disposition", "attachment;filename=girl.png");
		
		InputStream in = this.getServletContext().getResourceAsStream("/1.png");
		byte[] buffer = new byte[1024];
		int len = 0;
		
		ServletOutputStream out = response.getOutputStream();
		while((len=in.read(buffer))>0){
			out.write(buffer, 0, len);
		}
	}	

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}

}

演示结果:

访问:http:localhost:8080/myday04/servlet/ServletDemo1




作业

  • 请写一篇关于HTTP协议的笔记,要求:
    • 描述清楚HTTP请求、响应的格式
    • 请求头和响应头中各个头字段的含义
  • 如果浏览器传递给WEB服务器的参数内容超过1K,应该使用那种方式发送请求消息?
  • 请描述200、302、304、404和500等响应状态码所表示的意义。
  • 请列举三种禁止浏览器缓存的头字段,并写出相应的设置值。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值