Java web开发——HTTP协议

打个广告,帮朋友卖点东西,东西超便宜的哟【衣服鞋子等】,厂家直接出货,绝对低于市场价!!! 一般都比市场价便宜3—7折【都是牌子货】,如果您感兴趣,可以扫描屏幕下方的二维码,感谢关注!!!

微信

一、概念

1、基础概念

     客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。 

2、协议版本

      HTTP协议的版本:HTTP/1.0、HTTP/1.1

1.HTTP/1.0

     客户端与web服务器建立连接后,只能获得一个web资源。即拿到资源后即断开连接。

2.HTTP/1.1

     允许客户端与web服务器建立连接后,在一个连接上获取多个web资源,一般采用超时断开连接。

附:

     1.可以在cmd中启动telnet程序来实现一个请求与响应的详细过程,如启动连接localhost服务器的程序,并获取web应用mail下的a.html:

telnet localhost 8080

#=》

GET /mail/a.html

Host:localhost

     2.假设a.html中有如下代码:

asdafsdfas
​
<img src="1.img"/>
<img src="2.img"/>
<img src="3.img"/>

在获取资源时要访问多少次服务器?

第一次:获取a.html文件

第二次:遇到img标签,向服务器要取1.img

第三次:遇到img标签,向服务器要取2.img

第四次:遇到img标签,向服务器要取3.img

二、HTTP请求

     客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。一个完整的HTTP请求包括:一个请求行、若干消息头、以及实体内容,举例:

//请求行
GET /books/java.html HTTP/1.1
​
//请求头
Accept: */*
Accept-Language: en-us
Connection: Keep-Alive
Host: localhost
Referer: http://localhost/links.asp
User-Agent: Mozilla/4.0
Accept-Encoding: gzip, deflate
​
//请求实体

1、请求行

请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT

 

常用的有: GET、 POST

 

注意:

1.用户如没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。

 

2.不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:如请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:

GET /mail/1.html?name=abc&password=xyz HTTP/1.1

如请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据

 

3.GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。

Post方式的特点:传送的数据量无限制。

2、请求头

  • accept:浏览器通过这个头告诉服务器,它所支持的数据类型(text/html,image/* )
  • Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集,即编码方式(ISO-8859-1,UTF-8)
  • 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)
  • Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接(close【断开】/Keep-Alive 【保持】 )
  • User-Agent:客户机的环境(Mozilla/4.0 (compatible; MSIE 5.5; Windows 2003))
  • Cookie:
  • Date: 当前访问的时间(Tue, 11 Jul 2000 18:23:51 GMT)

三、HTTP响应

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

 

举例:

//状态行
HTTP/1.1 200 OK
​
//响应头
Server: Microsoft-IIS/5.0
Date: Thu, 13 Jul 2000 05:46:53 GMT
Content-Length: 2291
Content-Type: text/html
Cache-control: private
​
//空格
​
//实体内容
<HTML>
<BODY>

1、状态行

格式: HTTP版本号 状态码 原因叙述<CRLF>

举例:HTTP/1.1 200 OK

     其中状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:

状态码

含义

100~199

表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程

200~299

表示成功接收请求并已完成整个处理过程,常用200

300~399

为完成请求,客户需进一步细化请求。例如,请求的资源已经移动一个新地址,常用302(跳转到其他页面,重定向)、307和304(清理缓存)

400~499

客户端的请求有错误,常用404

500~599

服务器端出现错误,常用 500

2、响应头

  • Location: 服务器通过这个头,来告诉浏览器跳到哪里(http://www.sax.org/index.jsp )
  • 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:服务器通过这个头,告诉浏览器定时刷新,(并跳转到指定页面)( 3,1;url=http://www.it315.org)
  • Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打开数据(attachment; filename=aaa.zip)
  • Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的,数据太多( chunked)
  • Expire:控制浏览器不要缓存(-1表示不缓存,5表示缓存5秒)  
  • Cache-Control:控制浏览器不要缓存 (no-cache)  
  • Pragma:控制浏览器不要缓存 (no-cache )
  • Date: 响应时间(Tue, 11 Jul 2000 18:23:51 GMT)
  • Connection: 是否断开连接(close/Keep-Alive)

 

注意:控制浏览器不缓存有三个是因为有些浏览器可能不支持某方法

3、程序演示

WebRoot下有a.html,1.jpg

package com.shen;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
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 {
        test5(request,response);


    }
    //location头的应用
    public void test1(HttpServletRequest request, HttpServletResponse response){
        response.setStatus(302);//返回302错误
        response.setHeader("location", "/day04/1.html");//请求重定向
    }

    //数据压缩
    public void test2(HttpServletRequest request, HttpServletResponse response) throws IOException{
        String data = "abcdabcdabcdabcdabcdabcd";
        System.out.println("原始数据的大小为:" + data.getBytes().length);

        ByteArrayOutputStream bout = new ByteArrayOutputStream();//字节数组流

        GZIPOutputStream gout = new GZIPOutputStream(bout); //2.将压缩流中数据写入到字节数组中
        gout.write(data.getBytes());//data.getBytes()将数据转换为字节,1.将其写入到压缩流
        gout.close();//压缩流自带Buffer,故只有关闭资源后才会立即显示出来

        //得到压缩后的数据
        byte g[] = bout.toByteArray();


        response.setHeader("Content-Encoding", "gzip");
        response.setHeader("Content-Length",g.length +"");

        response.getOutputStream().write(g);
    }

    //指定回送数据类型
    public void test3(HttpServletRequest request, HttpServletResponse response) throws IOException{
        //.jpg文件对应的类型为"image/jpeg",可在tomcat_8.5\conf\web.xml中找【Ctrl+F=》输入>jpg(表示后缀为jpg)】
        response.setHeader("content-type", "image/jpeg");

        InputStream in = this.getServletContext().getResourceAsStream("/1.jpg");
        byte buffer[] = new byte[1024];
        int len = 0;
        OutputStream out = response.getOutputStream();
        while((len=in.read(buffer))>0){//将图片输出
            out.write(buffer, 0, len);
        }

    }

    //指定浏览器定时刷新
    public void test4(HttpServletRequest request, HttpServletResponse response) throws IOException{

                response.setHeader("refresh", "3");//每隔3秒刷新一次
        response.setHeader("refresh", "3;url='http://www.sina.com'");//三秒后跳到指定页面
        response.getWriter().write("abcd");


    }

    //指定浏览器下载
    public void test5(HttpServletRequest request, HttpServletResponse response) throws IOException{

        response.setHeader("content-disposition", "attachment;filename=xxx.jpg");//下载.jpg文件

        InputStream in = this.getServletContext().getResourceAsStream("/1.jpg");
        byte buffer[] = new byte[1024];
        int len = 0;
        OutputStream out = response.getOutputStream();
        while((len=in.read(buffer))>0){
            out.write(buffer, 0, len);
        }

    }
          
            //指定浏览器缓存时间(即在缓存时间内,浏览器取本地数据不请求服务器(如果是刷新则向服务器请求))
    public void test6(HttpServletRequest request, HttpServletResponse response) throws IOException{

        String data="abcdda"

        response.setDateHeader("expires", System.currentTimeMillis() + 24*3600*1000);//数据缓存一天

        response.getOutputStream().write(data.getBytes());


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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盡盡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值