日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Http协议入门

發(fā)布時(shí)間:2023/12/2 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Http协议入门 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[在此處輸入文章標(biāo)題]

?

?

1 web

?web入門

?????????????????? 1)web服務(wù)軟件作用: 把本地資源共享給外部訪問(wèn)

?????????????????? 2)tomcat服務(wù)器基本操作?????? :

???????????????????????????????????? 啟動(dòng): ?%tomcat%/bin/startup.bat

???????????????????????????????????? 關(guān)閉: %tomcat%/bin/shutdown.bat

?

???????????????????????????????????? 訪問(wèn)tomcat主頁(yè):

??????????????????????????????????????????????????????? http://localhost:8080

?????????????????? 3)web應(yīng)用目錄結(jié)構(gòu)

???????????????????????????????????? |- WebRoot?? 根目錄

?????????????????????????????????????????????? |-靜態(tài)資源(html css javascript images xml)? 可以直接被瀏覽器訪問(wèn)到的

?????????????????????????????????????????????? |-WEB-INF????????????????????????????????? 不可以直接被瀏覽器訪問(wèn)到

??????????????????????????????????????????????????????? |-classes???? 存放class字節(jié)碼文件

??????????????????????????????????????????????????????? |-lib???????? 存放jar包文件

??????????????????????????????????????????????????????? web.xml????? web應(yīng)用的配置文件,配置servlet

????????????????????????????????????

?????????????????? 4)Servlet技術(shù): 用java語(yǔ)言開發(fā)動(dòng)態(tài)資源的技術(shù)

???????????????????????????????????? 開發(fā)一個(gè)Servlet程序的步驟:

??????????????????????????????????????????????????????? 1)創(chuàng)建一個(gè)java類,繼承HttpServlet類

??????????????????????????????????????????????????????? 2)重寫HttpServlet類的doGet方法

??????????????????????????????????????????????????????? 3)把寫好的servlet程序交給tomcat服務(wù)器運(yùn)行!!!!

???????????????????????????????????????????????????????????????? 3.1 把編譯好的servlet的class文件拷貝到tomcat的一個(gè)web應(yīng)用中。(web應(yīng)用???????????????????????????????????????????????????????????????????????????????????????????? 的WEB-INF/classes目錄下)?????????????
???????????????????????????????????????????????????????????????? 3.2 在當(dāng)前web應(yīng)用的web.xml文件中配置servlet

??????????????????????????????????????????????????????????????????????????????????? <!-- servlet配置 -->

??????????????????????????????????????????????????????????????????????????????????? <servlet>

???????????????????????????????????????????????????????????????????????????????????????????? <servlet-name>HelloServlet</servlet-name>

???????????????????????????????????????????????????????????????????????????????????????????? <servlet-class>gz.itcast.HelloServlet</servlet-class>

??????????????????????????????????????????????????????????????????????????????????? </servlet>

??????????????????????????????????????????????????????????????????????????????????? <!--? servlet的映射配置 -->

??????????????????????????????????????????????????????????????????????????????????? <servlet-mapping>

???????????????????????????????????????????????????????????????????????????????????????????? <servlet-name> HelloServlet </servlet-name>

?????????????????????????????????????????????? ?????????????????????????????????????????????? <url-pattern>/hello</url-pattern>

??????????????????????????????????????????????????????????????????????????????????? </servlet-mapping>

??????????????????????????????????????????????????????? 4)訪問(wèn)servlet

?????????????????????????????????????????????????????????????????????????? http://localhost:8080/myweb/hello

?

今天的目標(biāo): http協(xié)議

?

2 Http協(xié)議入門

???????????????????? 2.1 什么是http協(xié)議

???????????????????????????????????? http協(xié)議: 對(duì)瀏覽器客戶端 和? 服務(wù)器端 之間數(shù)據(jù)傳輸?shù)母袷揭?guī)范

?

???????????????????? 2.2 查看http協(xié)議的工具

???????????????????????????????????? 1)使用火狐的firebug插件(右鍵->firebug->網(wǎng)絡(luò))

???????????????????????????????????? 2)使用谷歌的“審查元素”

???????????????????????????????????? 3)使用系統(tǒng)自帶的telnet工具(遠(yuǎn)程訪問(wèn)工具)?????????????????????????????????

??????????????????????????????????????????????????????? a)telnet localhost 8080????? 訪問(wèn)tomcat服務(wù)器

??????????????????????????????????????????????????????? b)ctrl ]???? 回車????????? 可以看到回顯

??????????????????????????????????????????????????????? c)輸入請(qǐng)求內(nèi)容

????????????????????????????????????????????????????????????????

GET /day09/hello HTTP/1.1

Host: localhost:8080

??????????????????????????????????????????????????????? d)回車,即可查看到服務(wù)器響應(yīng)信息。

?

???????????????????? 2.3 http協(xié)議內(nèi)容

???????????????????????????

請(qǐng)求(瀏覽器-》服務(wù)器)

GET /day09/hello HTTP/1.1

Host: localhost:8080

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0

Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Connection: keep-alive

?

????????

響應(yīng)(服務(wù)器-》瀏覽器)

HTTP/1.1 200 OK

Server: Apache-Coyote/1.1

Content-Length: 24

Date: Fri, 30 Jan 2015 01:54:57 GMT

?

this is hello servlet!!!

?

3 Http請(qǐng)求

GET /day09/hello HTTP/1.1 ??????????????-請(qǐng)求行

Host: localhost:8080??????????????????? --請(qǐng)求頭(多個(gè)key-value對(duì)象)

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0

Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Connection: keep-alive

??????????????????????????????????? --一個(gè)空行

name=eric&password=123456???????????? --(可選)實(shí)體內(nèi)容

?

????????????? 3.1 請(qǐng)求行

??????????????????????????? GET /day09/hello HTTP/1.1????

????????????? #http協(xié)議版本

?????????????????? http1.0:當(dāng)前瀏覽器客戶端與服務(wù)器端建立連接之后,只能發(fā)送一次請(qǐng)求,一次請(qǐng)求之后連接關(guān)閉。

?????????????????? http1.1:當(dāng)前瀏覽器客戶端與服務(wù)器端建立連接之后,可以在一次連接中發(fā)送多次請(qǐng)求。(基本都使用1.1)

?

????????????? #請(qǐng)求資源

???????????????????????????????????? URL:? 統(tǒng)一資源定位符。http://localhost:8080/day09/testImg.html。只能定位互聯(lián)網(wǎng)資源。是URI????????????????????????????????????????????????????????? 的子集。

???????????????????????????????????? URI: 統(tǒng)一資源標(biāo)記符。/day09/hello。用于標(biāo)記任何資源。可以是本地文件系統(tǒng),局域網(wǎng)的資源(//192.168.14.10/myweb/index.html),??????????????????????????????????????????????????? 可以是互聯(lián)網(wǎng)。

????????????? #請(qǐng)求方式

??????????????????????????? 常見的請(qǐng)求方式: GET 、 POST、 HEAD、 TRACE、 PUT、 CONNECT 、DELETE????

?

??????????????????????????? 常用的請(qǐng)求方式: GET? 和 POST?

?

??????????????????????????? 表單提交:

???????????????????????????????????? <form action="提交地址" method="GET/POST">???

?

???????????????????????????????????? <form>

?

??????????????????????????? GET?? vs? POST 區(qū)別

?

??????????????????????????? 1)GET方式提交

?????????????????????????????????????????????? a)地址欄(URI)會(huì)跟上參數(shù)數(shù)據(jù)。以?開頭,多個(gè)參數(shù)之間以&分割。

GET /day09/testMethod.html?name=eric&password=123456 HTTP/1.1

Host: localhost:8080

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0

Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Referer: http://localhost:8080/day09/testMethod.html

Connection: keep-alive

?

?????????????????????????????????????????????? b)GET提交參數(shù)數(shù)據(jù)有限制,不超過(guò)1KB。

?????????????????????????????????????????????? c)GET方式不適合提交敏感密碼。

?????????????????????????????????????????????? d)注意: 瀏覽器直接訪問(wèn)的請(qǐng)求,默認(rèn)提交方式是GET方式

?????????????????? ???????? 2)POST方式提交

???????????????????????????????????? a)參數(shù)不會(huì)跟著URI后面。參數(shù)而是跟在請(qǐng)求的實(shí)體內(nèi)容中。沒(méi)有?開頭,多個(gè)參數(shù)之間以&分割。

POST /day09/testMethod.html HTTP/1.1

Host: localhost:8080

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0

Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Referer: http://localhost:8080/day09/testMethod.html

Connection: keep-alive

?

name=eric&password=123456

?

?????????????????? ??????????????????????????? b)POST提交的參數(shù)數(shù)據(jù)沒(méi)有限制。

?????????????????????????????????????????????? c)POST方式提交敏感數(shù)據(jù)。

????????????? 3.2 請(qǐng)求頭

Accept: text/html,image/*????? -- 瀏覽器接受的數(shù)據(jù)類型

Accept-Charset: ISO-8859-1???? -- 瀏覽器接受的編碼格式

Accept-Encoding: gzip,compress? --瀏覽器接受的數(shù)據(jù)壓縮格式

Accept-Language: en-us,zh-?????? --瀏覽器接受的語(yǔ)言

Host: www.it315.org:80????????? --(必須的)當(dāng)前請(qǐng)求訪問(wèn)的目標(biāo)地址(主機(jī):端口)

If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT? --瀏覽器最后的緩存時(shí)間

Referer: http://www.it315.org/index.jsp?? ???-- 當(dāng)前請(qǐng)求來(lái)自于哪里

User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)? --瀏覽器類型

Cookie:name=eric???????????????????? -- 瀏覽器保存的cookie信息

Connection: close/Keep-Alive??????????? -- 瀏覽器跟服務(wù)器連接狀態(tài)。close: 連接關(guān)閉? keep-alive:保存連接。

Date: Tue, 11 Jul 2000 18:23:51 GMT????? -- 請(qǐng)求發(fā)出的時(shí)間

?

????????????? 3.3 實(shí)體內(nèi)容

???????????????????????????????????? 只有POST提交的參數(shù)會(huì)放到實(shí)體內(nèi)容中

?

????????????? 3.4 HttpServletRequest對(duì)象

??????????????????????????? HttpServletRequest對(duì)象作用是用于獲取請(qǐng)求數(shù)據(jù)。

?

???????????????????????????????????? ?? 核心的API:

?????????????????????????????????????????????? 請(qǐng)求行:

??????????????????????????????????????????????????????? request.getMethod(); ??請(qǐng)求方式

??????????????????????????????????????????????????????? request.getRequetURI()?? / request.getRequetURL()?? 請(qǐng)求資源

??????????????????????????????????????????????????????? request.getProtocol()?? 請(qǐng)求http協(xié)議版本

??????????????????????????????????????????????

?????????????????????????????????????????????? 請(qǐng)求頭:

??????????????????????????????????????????????????????? request.getHeader("名稱")?? 根據(jù)請(qǐng)求頭獲取請(qǐng)求值

??????????????????????????????????????????????????????? request.getHeaderNames()??? 獲取所有的請(qǐng)求頭名稱

?

?????????????????????????????????????????????? 實(shí)體內(nèi)容:

??????????????????????????????????????????????????????? request.getInputStream()?? 獲取實(shí)體內(nèi)容數(shù)據(jù)

????????????? 3.5 service 和 doXX方法區(qū)別

?

???????????????????????????

HttpSevlet類的源碼:

protected void service(HttpServletRequest req, HttpServletResponse resp)

??????? throws ServletException, IOException {

?????? //得到請(qǐng)求方式

??????? String method = req.getMethod();

?

??????? if (method.equals(METHOD_GET)) {

??????????? long lastModified = getLastModified(req);

??????????? if (lastModified == -1) {

??????????????? // servlet doesn't support if-modified-since, no reason

??????????????? // to go through further expensive logic

?? ?????????????doGet(req, resp);

??????????? } else {

??????????????? long ifModifiedSince;

??????????????? try {

??????????????????? ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);

??????????????? } catch (IllegalArgumentException iae) {

?????????? ?????????// Invalid date header - proceed as if none was set

??????????????????? ifModifiedSince = -1;

??????????????? }

??????????????? if (ifModifiedSince < (lastModified / 1000 * 1000)) {

??????????????????? // If the servlet mod time is later, call doGet()

??????????????????? // Round down to the nearest second for a proper compare

??????????????????? // A ifModifiedSince of -1 will always be less

??????????????????? maybeSetLastModified(resp, lastModified);

?????????????????? ?doGet(req, resp);

?????? ?????????} else {

??????????????????? resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);

??????????????? }

??????????? }

?

??????? } else if (method.equals(METHOD_HEAD)) {

??????????? long lastModified = getLastModified(req);

??????????? maybeSetLastModified(resp, lastModified);

??????????? doHead(req, resp);

?

??????? } else if (method.equals(METHOD_POST)) {

??????????? doPost(req, resp);

???????????

??????? } else if (method.equals(METHOD_PUT)) {

??????????? doPut(req, resp);???????

???????????

?????? ?} else if (method.equals(METHOD_DELETE)) {

?????????? ?doDelete(req, resp);

???????????

??????? } else if (method.equals(METHOD_OPTIONS)) {

??????????? doOptions(req,resp);

???????????

??????? } else if (method.equals(METHOD_TRACE)) {

??????????? doTrace(req,resp);

???????????

??????? } else {

??????????? //

??????????? // Note that this means NO servlet supports whatever

??????????? // method was requested, anywhere on this server.

??????????? //

?

??????????? String errMsg = lStrings.getString("http.method_not_implemented");

??????????? Object[] errArgs = new Object[1];

??????????? errArgs[0] = method;

??????????? errMsg = MessageFormat.format(errMsg, errArgs);

???????????

??????????? resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);

??? ????}

??? }

?

????????????? 3.6 案例-獲取瀏覽器的類型(user-agent)

????????????? 3.7 案例- 防止非法鏈接(referer)

第1次????????????????????? CSDN/51CTO??? ->?? 頁(yè)面(點(diǎn)擊下載)?? -> 彈出廣告頁(yè)面(點(diǎn)擊此處下載) -> 開始下載?

第2次??????? ?直接點(diǎn)擊此處下載? ->? 轉(zhuǎn)回廣告頁(yè)面? ->? 開始下載

?

???????????????????????????????????? 非法鏈接:??????????????????????????????????????????????????????????

??????????????????????????????????????????????????????? 1)直接訪問(wèn)下載的資源

??????????????????????????????????????????????????????? 2)不是從廣告頁(yè)面過(guò)來(lái)的鏈接

?

???????????????????????????????????? referer: 當(dāng)前請(qǐng)求來(lái)自于哪里。

????????????? 3.8 傳遞的請(qǐng)求參數(shù)如何獲取??????????

??????????????????????????? ?GET方式: 參數(shù)放在URI后面

??????????????????????????? ?POST方式: 參數(shù)放在實(shí)體內(nèi)容中

?

??????????????????????????? 獲取GET方式參數(shù):

?????????????????????????????????????????????? request.getQueryString();

??????????????????????????? 獲取POST方式參數(shù):

?????????????????????????????????????????????? request.getInputStream();

?

??????????????????????????? 問(wèn)題:但是以上兩種不通用,而且獲取到的參數(shù)還需要進(jìn)一步地解析。

??????????????????????????? 所以可以使用統(tǒng)一方便的獲取參數(shù)的方式:

????????????????????????????????????

??????????????????????????? ??????? 核心的API:

???????????????????????????????????? request.getParameter("參數(shù)名");? 根據(jù)參數(shù)名獲取參數(shù)值(注意,只能獲取一個(gè)值的參數(shù))

???????????????????????????????????? request.getParameterValue("參數(shù)名“);根據(jù)參數(shù)名獲取參數(shù)值(可以獲取多個(gè)值的參數(shù))

?

???????????????????????????????????? request.getParameterNames();?? 獲取所有參數(shù)名稱列表 ?

????????????? 3.9 請(qǐng)求參數(shù)編碼問(wèn)題

???????????????????????????????????? 修改POST方式參數(shù)編碼:

??????????????????????????????????????????????????????? request.setCharacterEncoding("utf-8");

???????????????????????????????????? 修改GET方式參數(shù)編碼:

??????????????????????????????????????????????????????? 手動(dòng)解碼:String name = new String(name.getBytes("iso-8859-1"),"utf-8");

4 Http響應(yīng)

HTTP/1.1 200 OK??????????????? --響應(yīng)行

Server: Apache-Coyote/1.1???????? --響應(yīng)頭(key-vaule)

Content-Length: 24

Date: Fri, 30 Jan 2015 01:54:57 GMT

?????????????????????????????????? --一個(gè)空行

this is hello servlet!!!????????????????? --實(shí)體內(nèi)容

?

???????????????????? 4.1 響應(yīng)行

????????????? ???? #http協(xié)議版本

???????????????????? ?#狀態(tài)碼: 服務(wù)器處理請(qǐng)求的結(jié)果(狀態(tài))

?????????????????????????????????????????????? 常見的狀態(tài):

??????????????????????????????????????????????????????? 200 :? 表示請(qǐng)求處理完成并完美返回

??????????????????????????????????????????????????????? 302:?? 表示請(qǐng)求需要進(jìn)一步細(xì)化。
??????????????????????????????????????????????????????? 404:?? 表示客戶訪問(wèn)的資源找不到。

??????????????????????????????????????????????????????? 500:?? 表示服務(wù)器的資源發(fā)送錯(cuò)誤。(服務(wù)器內(nèi)部錯(cuò)誤)

???????????????????? #狀態(tài)描述????????

????? 4.2 常見的響應(yīng)頭

Location: http://www.it315.org/index.jsp?? -表示重定向的地址,該頭和302的狀態(tài)碼一起使用。

Server:apache tomcat???????????????? ---表示服務(wù)器的類型

Content-Encoding: gzip? ???????????????-- 表示服務(wù)器發(fā)送給瀏覽器的數(shù)據(jù)壓縮類型

Content-Length: 80??????????????????? --表示服務(wù)器發(fā)送給瀏覽器的數(shù)據(jù)長(zhǎng)度

Content-Language: zh-cn?????????????? --表示服務(wù)器支持的語(yǔ)言

Content-Type: text/html; charset=GB2312 ??--表示服務(wù)器發(fā)送給瀏覽器的數(shù)據(jù)類型及內(nèi)容編碼

Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT? --表示服務(wù)器資源的最后修改時(shí)間

Refresh: 1;url=http://www.it315.org???? --表示定時(shí)刷新

Content-Disposition: attachment; filename=aaa.zip --表示告訴瀏覽器以下載方式打開資源(下載文件時(shí)用到)

Transfer-Encoding: chunked

Set-Cookie:SS=Q0=5Lb_nQ; path=/search?? --表示服務(wù)器發(fā)送給瀏覽器的cookie信息(會(huì)話管理用到)

Expires: -1?????????????????????????? --表示通知瀏覽器不進(jìn)行緩存

Cache-Control: no-cache

Pragma: no-cache

Connection: close/Keep-Alive ??????????--表示服務(wù)器和瀏覽器的連接狀態(tài)。close:關(guān)閉連接 keep-alive:保存連接

?

???????????????????? 4.3 HttpServletResponse對(duì)象

??????????????????????????? HttpServletResponse對(duì)象修改響應(yīng)信息:

?

?????????????????????????????????????????????? 響應(yīng)行:

???????????????????????????????????????????????????????????????? response.setStatus()? 設(shè)置狀態(tài)碼

?????????????????????????????????????????????? 響應(yīng)頭:

???????????????????????????????????????????????????????????????? response.setHeader("name","value")? 設(shè)置響應(yīng)頭

?????????????????????????????????????????????? 實(shí)體內(nèi)容:

???????????????????????????????????????????????????????????????? response.getWriter().writer();?? 發(fā)送字符實(shí)體內(nèi)容

???????????????????????????????????????????????????????????????? response.getOutputStream().writer()? 發(fā)送字節(jié)實(shí)體內(nèi)容

?

???????????????????? 4.4 案例- 請(qǐng)求重定向(Location)

???????????????????? 4.5 案例- 定時(shí)刷新(refresh)

???????????????????? 4.6 案例-content-Type作用

?

?????????????????? 總結(jié):

???????????????????????????????????? http協(xié)議: 瀏覽器和服務(wù)器之間數(shù)據(jù)傳輸?shù)母袷揭?guī)范

?

???????????????????????????????????? 1)http請(qǐng)求:

??????????????????????????????????????????????????????? 格式:

?????????????????????????????????????????????????????????????????????????? 請(qǐng)求行

?????????????????????????????????????????????????????????????????????????? 請(qǐng)求頭

?????????????????????????????????????????????????????????????????????????? 空行

?????????????????????????????????????????????????????????????????????????? 實(shí)體內(nèi)容(POST提交的數(shù)據(jù)在實(shí)體內(nèi)容中)

??????????????????????????????????????????????????????? 重點(diǎn):

???????????????????????????????????????????????????????????????? 使用HttpServletRequest對(duì)象: 獲取請(qǐng)求數(shù)據(jù)

?

??????????????????????????? 2)http響應(yīng);

?????????????????????????????????????????????? 格式:

???????????????????????????????????????????????????????????????? 響應(yīng)行

???????????????????????????????????????????????????????????????? 響應(yīng)頭

???????????????????????????????????????????????????????????????? 空行

???????????????????????????????????????????????????????????????? 實(shí)體內(nèi)容(瀏覽器看到的內(nèi)容)

?????????????????????????????????????????????? 重點(diǎn):

?????????????????????????????????????????????? ???????? 使用HttpServletResponse對(duì)象: 設(shè)置響應(yīng)數(shù)據(jù)

?

???????????????????????????

本文轉(zhuǎn)載于:猿2048?https://www.mk2048.com/blog/blog.php?id=ii1jaab&title=Http協(xié)議入門

總結(jié)

以上是生活随笔為你收集整理的Http协议入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。