JavaWeb 4 -- Http 프로 토 콜 깊이 분석

31527 단어 자바Web
1. HTTP 프로 토 콜 이 무엇 입 니까?
HTTP 는 하이퍼텍스트 transfer protocol (하이퍼텍스트 전송 프로 토 콜) 의 약자 로 TCP / IP 프로 토 콜 의 응용 층 프로 토 콜 로 WEB 브 라 우 저 와 WEB 서버 간 의 데 이 터 를 교환 하 는 과정 을 정의 합 니 다.클 라 이언 트 가 웹 서버 에 연 결 된 후 웹 서버 의 한 웹 자원 을 얻 으 려 면 일정한 통신 형식 을 지 켜 야 합 니 다. HTTP 프로 토 콜 은 클 라 이언 트 와 웹 서버 의 빠 른 형식 을 정의 하 는 데 사 용 됩 니 다.
2. HTTP 프로 토 콜 의 버 전
HTTP 프로 토 콜 버 전: HTTP / 1.0, HTTP / 1.1
3. HTTP 1.0 과 HTTP 1.1 의 차이
HTTP 1.0 프로 토 콜 에서 클 라 이언 트 가 웹 서버 와 연결 되면 웹 자원 하나만 얻 을 수 있 습 니 다.HTTP 1.1 프로 토 콜 에서 클 라 이언 트 가 웹 서버 와 연결 한 후 한 연결 에서 여러 개의 웹 자원 을 가 져 올 수 있 도록 합 니 다.
4. HTTP 요청
4.1 HTTP 요청 에 포 함 된 내용
클 라 이언 트 가 서버 에 연결 되면 서버 에 웹 자원 을 요청 합 니 다. 클 라 이언 트 가 서버 에 HTTP 요청 을 보 냈 다 고 합 니 다.
하나의 완전한 HTTP 요청 은 다음 과 같은 내용 을 포함한다. 하나의 요청 줄, 몇 개의 메시지 헤더, 그리고 실제 내용 의 범례 를 포함한다.
   深入分析JavaWeb 4 -- Http协议_第1张图片
4.2 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=xyz HTTP/1.1 GET 방식 의 특징: URL 주소 뒤에 첨부 된 매개 변 수 는 제한 이 있 고 데이터 용량 은 보통 1K 를 초과 할 수 없습니다.요청 방식 이 POST 방식 이 라면 요청 한 실체 내용 에서 서버 에 데 이 터 를 보 낼 수 있 습 니 다. Post 방식 의 특징: 전송 한 데 이 터 는 무제 한 입 니 다.
4.3 HTTP 요청 의 세부 사항 - 메시지 헤더
HTTP 요청 에 자주 사용 되 는 메시지 헤더
  • accept: 브 라 우 저 는 이 헤드 를 통 해 서버 에 지원 하 는 데이터 형식
  • 을 알려 줍 니 다.
  • Accept - Charset: 브 라 우 저 는 이 머리 를 통 해 서버 에 어떤 문자 집합 을 지원 하 는 지 알려 줍 니 다
  • Accept - Encoding: 브 라 우 저 는 이 헤드 를 통 해 서버 에 지원 하 는 압축 형식
  • 을 알려 줍 니 다.
  • Accept - language: 브 라 우 저 는 이 머리 를 통 해 서버 에 언어 환경
  • 을 알려 줍 니 다.
  • Host: 브 라 우 저 는 이 헤드 를 통 해 서버 에 어떤 호스트 에 접근 하고 싶 은 지 알려 줍 니 다
  • If - Modified - Since: 브 라 우 저 는 이 헤드 를 통 해 서버 에 캐 시 데이터 의 시간 을 알려 줍 니 다
  • Referer: 브 라 우 저 는 이 머리 를 통 해 서버 에 클 라 이언 트 기기 가 어느 페이지 에서 온 도 난 방지 체인 인지 알려 줍 니 다
  • Connection: 브 라 우 저 는 이 헤드 를 통 해 서버 에 요청 이 끝 난 후에 링크 를 끊 는 지, 아니면 어떤 링크 를 가지 고 있 는 지 알려 줍 니 다
  • 예 를 들 면:
    Accept: 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, */* Referer: http://localhost:8080/JavaWebDemoProject/Web/2.jsp Accept-Language: zh-CN User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3) Accept-Encoding: gzip, deflate Host: localhost:8080 Connection: Keep-Alive

    HTTP 응답
    5.1 HTTP 응답 에 포 함 된 내용
    하나의 HTTP 응답 은 서버 가 클 라 이언 트 에 게 전송 하 는 데 이 터 를 대표 합 니 다. 이 는 하나의 상태 줄, 몇 개의 메시지 헤더, 그리고 실체 내용 을 포함 합 니 다.深入分析JavaWeb 4 -- Http协议_第2张图片 범례:
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Content-Type: text/html;charset=ISO-8859-1
    Content-Length: 105
    Date: Tue, 27 May 2014 16:23:28 GMT
    
    <html> <head> <title>Hello World JSP</title> </head> <body> Hello World! </body> </html>

    5.2 HTTP 응답 디 테 일 - 상태 줄
    상태 줄 형식: HTTP 버 전 번호 상태 코드 원인 설명 <CRLF>
        :HTTP/1.1 200 OK
    

    상태 코드 는 서버 가 요청 한 처리 결 과 를 나타 내 는 데 사 용 됩 니 다. 세 자리 의 10 진수 입 니 다.응답 상태 코드 는 5 가지 로 나 뉘 는데 다음 과 같다.
    深入分析JavaWeb 4 -- Http协议_第3张图片
    5.3 HTTP 응답 디 테 일 -- 상용 응답 헤드
    HTTP 응답 에 자주 사용 되 는 응답 헤더 (메시지 헤더)
  • 위치: 서버 는 이 머리 를 통 해 브 라 우 저 에 게 어디로 뛰 는 지 알려 줍 니 다
  • Server: 서버 가 이 헤드 를 통 해 브 라 우 저 서버 의 모델
  • 을 알려 줍 니 다.
  • Content - Encoding: 서버 는 이 머리 를 통 해 브 라 우 저 에 게 데이터 의 압축 형식
  • 을 알려 줍 니 다.
  • Content - Length: 서버 는 이 헤드 를 통 해 브 라 우 저 에 데 이 터 를 전송 하 는 길 이 를 알려 줍 니 다
  • Content - Language: 서버 가 이 헤드 를 통 해 브 라 우 저 언어 환경 을 알려 줍 니 다
  • Content - Type: 서버 가 이 헤드 를 통 해 브 라 우 저 에 데 이 터 를 전송 하 는 유형 을 알려 줍 니 다
  • Refresh: 서버 가 이 머리 를 통 해 브 라 우 저 에 게 정시 리 셋
  • 을 알려 줍 니 다.
  • Content - Disposition: 서버 는 이 헤드 를 통 해 브 라 우 저 에 게 다운로드 방식 으로 데 이 터 를 치 라 고 알려 줍 니 다
  • Transfer - Encoding: 서버 는 이 헤드 를 통 해 브 라 우 저 데 이 터 를 블록 으로 전송 하 는 것 을 알려 줍 니 다
  • Expires: - 1 브 라 우 저 캐 시 하지 않 기
  • Cache-Control: no-cache   
  • Pragma:no-cache

  • 6. 서버 에서 응답 헤드 를 설정 하여 클 라 이언 트 브 라 우 저의 행동 을 제어 합 니 다.
    6.1. 위치 응답 헤드 를 설정 하여 재 설정 요청
    package gacl.http.study;
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /** * @author gacl * */
    public class ServletDemo01 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            response.setStatus(302);//           
            /** *     ,      Location   ,          ,            */
            response.setHeader("Location", "/JavaWeb_HttpProtocol_Study_20140528/1.jsp");
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            this.doGet(request, response);
        }
    }

    "브 라 우 저 에서 URL 주 소 를 사용 할 때"http://localhost:8080/JavaWeb_HttpProtocol_Study_20140528 / servlet / servletDemo 01 "ServletDemo 01 을 방문 하면 서버 가 응답 한 후 브 라 우 저 에 보 내 는 상태 코드 와 응답 헤드 정 보 를 볼 수 있 습 니 다. 아래 그림 과 같 습 니 다.
      这里写图片描述  
    서버 가 302 상태 코드 를 되 돌려 브 라 우 저 에 게 당신 이 원 하 는 자원 이 없다 는 것 을 알려 줍 니 다. 그러나 나 는 Location 응답 헤드 를 통 해 어디 에 있 는 지 알려 줍 니 다. 브 라 우 저 는 응답 헤드 Location 를 분석 한 후에 /JavaWeb_HttpProtocol_Study_20140528/1.jsp 페이지 로 넘 어가 야 한 다 는 것 을 알 기 때문에 자동 으로 1.jsp 로 넘 어 갑 니 다. 다음 그림 과 같 습 니 다.
      
    6.2 Content - Encoding 응답 헤드 를 설정 하여 브 라 우 저 데이터 의 압축 형식 을 알려 줍 니 다.
    package gacl.http.study;
    
    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;
    /** * @author gacl *                   *1、  GZIPOutputStream       *2、     Content-Encoding      ,                 */
    public class ServletDemo02 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String data = "abcdabcdabcdabcdabcdabcdab" +
                    "cdabcdabcdabcdabcdabcdabcdabcdabc" +
                    "dabcdabcdabcdabcdabcdabcdabcdabc" +
                    "dabcdabcdabcdabcdabcdabcdabcdabcdab" +
                    "cdabcdabcdabcdabcdabcdabcdabcdabcdab" +
                    "cdabcdabcdabcdabcdabcdabcdabcdabcdab" +
                    "cdabcdabcdabcdabcdabcdabcdabcdabcdab" +
                    "cdabcdabcdabcdabcdabcdabcdabcdabcdabcd";
            System.out.println("        :" + data.getBytes().length);
    
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            GZIPOutputStream gout = new GZIPOutputStream(bout); //buffer
            gout.write(data.getBytes());
            gout.close();
            //        
            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 {
            this.doGet(request, response);
        }
    }

    서버 가 브 라 우 저 에 보 낸 응답 정 보 는 다음 과 같 습 니 다.
    深入分析JavaWeb 4 -- Http协议_第4张图片
    브 라 우 저가 지원 하 는 압축 형식 은 다음 과 같 습 니 다. 这里写图片描述
    6.3. content - type 응답 헤드 를 설정 하고 전송 데이터 형식 을 지정 합 니 다.
    package gacl.http.study;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class ServletDemo03 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            /** *       (Accept)      : * 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/jpeg");//  content-type                 "image/jpeg"
            //           img      WP_20131005_002.jpg    ,       
            InputStream in = this.getServletContext().getResourceAsStream("/img/WP_20131005_002.jpg");
            byte buffer[] = new byte[1024];
            int len = 0;
            OutputStream out = response.getOutputStream();//     
            while ((len = in.read(buffer)) > 0) {//     (in)           (buffer)
                out.write(buffer, 0, len);//               
            }
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            this.doGet(request, response);
        }
    }

    서버 가 브 라 우 저 에 보 낸 응답 정 보 는 다음 과 같 습 니 다.
    深入分析JavaWeb 4 -- Http协议_第5张图片
    ServletDemo 03 의 운행 결 과 는 다음 그림 과 같다.
    深入分析JavaWeb 4 -- Http协议_第6张图片
    브 라 우 저 에 그림 표시
    6.4 、 refresh 응답 헤드 를 설정 하여 브 라 우 저 를 정기 적 으로 새로 고침 합 니 다.
    package gacl.http.study;
    
    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 ServletDemo04 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            /** *   refresh   ,      3      */
            // response.setHeader("refresh", "3");
            /** *   refresh   ,    3     http://www.baidu.com */
            response.setHeader("refresh", "3;url='http://www.baidu.com'");
            response.getWriter().write("gacl");
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            this.doGet(request, response);
        }
    
    }

    6.5. content - disposition 응답 헤드 를 설정 하여 브 라 우 저 로 하여 금 파일 을 다운로드 하 게 합 니 다.
    package gacl.http.study;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ServletDemo05 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            /** *   content-disposition   ,         */
            response.setHeader("content-disposition", "attachment;filename=xxx.jpg");
            InputStream in = this.getServletContext().getResourceAsStream("/img/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 doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            this.doGet(request, response);
        }
    
    }

    브 라 우 저 에서 ServletDemo 05 를 방문 하면 다음 그림 과 같이 파일 다운로드 상자 가 팝 업 됩 니 다.
    深入分析JavaWeb 4 -- Http协议_第7张图片

    좋은 웹페이지 즐겨찾기