HTTP和應(yīng)用問題
HTTP協(xié)議
應(yīng)用層協(xié)議存璃,針對服務(wù)器端和客戶端的應(yīng)用之間的傳輸協(xié)議
HTTP協(xié)議(HyperText Transfer Protocol帕识,超文本傳輸協(xié)議)是用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議
RFC2616或详,HTTP協(xié)議采用了請求/響應(yīng)模型
版本
HTTP/1.0
這是第一個在通訊中指定版本號的HTTP 協(xié)議版本貌虾,至今仍被廣泛采用搬设,特別是在代理服務(wù)器中【一般用于郵箱代理服務(wù)器】
Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 服務(wù)器竭沫,也是一個 IMAP/POP3/SMTP 服務(wù)器筒主。內(nèi)存少关噪,并發(fā)能力強(qiáng)
HTTP/1.1
當(dāng)前版本鸟蟹。默認(rèn)采用keep-alive模式,并能很好地配合代理服務(wù)器工作使兔。還支持以管道方式同時發(fā)送多個請求建钥,以便降低線路負(fù)載,提高傳輸速度虐沥。
HTTP/2
報文
Request請求
消息頭部:
- Accept 可接受的數(shù)據(jù)類型熊经,MIME;
- Accept-Language
- Accept-Encoding
- User-Agent 發(fā)送端的系統(tǒng)信息【以Mozilla標(biāo)準(zhǔn):瀏覽器類型欲险,OS類型奈搜,使用的平臺庫等】
- Referer 當(dāng)請求的uri不存在時,轉(zhuǎn)至的上一個界面
- Host 請求端的域名
- Connection 連接方式盯荤,持久連接 keep-alive
-
Cookie
get方式最多傳遞2038個字符馋吗;post將參數(shù)信息保存在request報文的請求體中
=》通過GET方法提交數(shù)據(jù),則數(shù)據(jù)存放在QUERY_STRING環(huán)境變量中秋秤,而POST方法提交的數(shù)據(jù)則可以從標(biāo)準(zhǔn)輸入流中獲取宏粤。
Response返回
狀態(tài)行
協(xié)議版本號 狀態(tài)碼 狀態(tài)code
消息報頭
Location 重定向接受到的Referer所指向的位置
Server 服務(wù)器端的信息
....
消息體
消息頭部:
- Content-Encoding
- Content-Language
- Content-Length 字節(jié)方式存儲
- Content-Type
-
date Last-Modified、Expires實(shí)體報頭域給出響應(yīng)過期的日期和時間
HTTP狀態(tài)碼:
1xx:指示信息--表示請求已接收灼卢,繼續(xù)處理绍哎。
2xx:成功--表示請求已被成功接收、理解鞋真、接受崇堰。
3xx:重定向--要完成請求必須進(jìn)行更進(jìn)一步的操作。
4xx:客戶端錯誤--請求有語法錯誤或請求無法實(shí)現(xiàn)涩咖。
5xx:服務(wù)器端錯誤--服務(wù)器未能實(shí)現(xiàn)合法的請求海诲。
常見狀態(tài)代碼、狀態(tài)描述的說明如下:
200 OK:客戶端請求成功檩互。
300:Multiple Choices/多重選擇特幔,表示被請求的文檔可以在多個地方找到
301:Moved Permanently,指所請求的文檔在別的地方闸昨,瀏覽器會自動連接到新的URL
302:Found/找到蚯斯,臨時交換地址而不是永久
303:See Other/參見其他信息
304:未修改;
400 Bad Request:客戶端請求有語法錯誤饵较,不能被服務(wù)器所理解拍嵌。
401 Unauthorized:請求未經(jīng)授權(quán),這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用循诉。
403 Forbidden:服務(wù)器收到請求横辆,但是拒絕提供服務(wù)。
404 Not Found:請求資源不存在打洼,舉個例子:輸入了錯誤的URL龄糊。
500 Internal Server Error:服務(wù)器發(fā)生不可預(yù)期的錯誤逆粹。
503 Server Unavailable:服務(wù)器當(dāng)前不能處理客戶端的請求募疮,一段時間后可能恢復(fù)正常炫惩。
tcp三次握手四次揮手協(xié)議
client首先發(fā)送連接請求,發(fā)送報文段阿浓,包括ack=0,syn=1,seq=x
server收到請求他嚷,為該TCP分配緩存及變量,發(fā)送報文段芭毙,包括ack=1,syn=1,ack=x+1,seq=y
client收到后確認(rèn)筋蓖,為該tcp分配緩存及變量,包括ack=1,syn=1,ack=y+1,seq=x+1
client發(fā)final報文退敦,
server仍在傳輸粘咖,發(fā)ack報文;
待完成傳輸后侈百,發(fā)final報文
client收到后發(fā)ack報文瓮下,server收到后才可以斷開連接
相應(yīng)狀態(tài):listen sys-send syn-revd established fin-wait close-wait time-wait last-ack close
=》socket連接建立
UDP和TCP的區(qū)別:
TCP,傳輸控制協(xié)議钝域;面向連接的讽坏、可靠的字節(jié)流傳輸服務(wù)。bs交換數(shù)據(jù)前需三次握手協(xié)議建立連接例证;通過包的序號保證超時重發(fā)路呜、重復(fù)包丟棄、順序傳輸织咧;bs雙方需建立tcp緩存及變量空間胀葱,系統(tǒng)開銷大些。
UDP笙蒙,用戶數(shù)據(jù)報協(xié)議巡社;面向無連接的、非可靠的數(shù)據(jù)報協(xié)議手趣。數(shù)據(jù)結(jié)構(gòu)簡單晌该、系統(tǒng)開銷小,傳輸速度快绿渣。=》可以在應(yīng)用層增加相關(guān)機(jī)制保證可靠與控制機(jī)制朝群。
FTP、Telnet中符、SMTP(郵件傳輸協(xié)議姜胖,25)、HTTP淀散、POP3(支持使用客戶端遠(yuǎn)程管理在服務(wù)器上的電子郵件右莱,提供了SSL加密的POP3協(xié)議被稱為POP3S)等蚜锨;
UDP是面向無連接的,使用這個協(xié)議的常見服務(wù)有DNS慢蜓、SNMP(簡單網(wǎng)絡(luò)管理協(xié)議)亚再、QQ、流媒體協(xié)議等
現(xiàn)代瀏覽器:
從輸入URL到頁面下載完的過程中都發(fā)生了什么事情:
1晨抡、DNS的domain遞歸解析【首先瀏覽器緩存氛悬、在再OS緩存中找,沒有向localDNS服務(wù)器找耘柱,向根服務(wù)器找如捅;根服務(wù)器返回區(qū)域的DNS服務(wù)器】
根據(jù)域名級別,一次從一級域名向二級调煎、三級找镜遣。
2、tcp的三次握手【根據(jù)ip發(fā)起網(wǎng)絡(luò)連接士袄,可能遇到重定向問題悲关,那重復(fù)1找到重定向之后的server】
3、browser的httprequest【包括資源路徑窖剑、身份驗(yàn)證】
4坚洽、server的httpresponse【client收到響應(yīng)內(nèi)容,頁面中的url西土,如圖像等資源再次請求讶舰;再進(jìn)行網(wǎng)頁渲染,包含css之后的html及圖片】
3需了、4主要和帶寬有關(guān)
解析html構(gòu)建dom樹->構(gòu)建render樹->布局render樹->繪制render樹跳昼。
加載速度的優(yōu)化:
瀏覽器內(nèi)核技術(shù):緩存、預(yù)取肋乍、壓縮鹅颊、并行;
DNS級緩存預(yù)饶乖臁:1堪伍、瀏覽器DNS緩存;2觅闽、系統(tǒng)DNS緩存帝雇;3、Hosts文件蛉拙;4尸闸、各個DNS服務(wù)器上的緩存
HTTP和HTTPS的區(qū)別:
https安全性比http高,基于http+ssl,端口號為443吮廉。主要是可進(jìn)行加密傳輸苞尝、身份認(rèn)證
1、身份認(rèn)證宦芦,需要server端有CA證書宙址,證明服務(wù)器用途類型;
2踪旷、bs之間所有傳輸內(nèi)容都經(jīng)過加密曼氛; i. 具體講,是客戶端產(chǎn)生一個對稱的密鑰,通過server 的證書來交換密鑰. 一般意義上的握手過程. ii. 接下來所有的信息往來就都是加密的. 第三方即使截獲,也沒有任何意義.
【SSL豁辉,SSL運(yùn)行在TCP/IP層之上令野、應(yīng)用層之下,為應(yīng)用程序提供加密數(shù)據(jù)通道徽级,它采用了RC4气破、MD5 以及RSA等加密算法,使用40 位的密鑰餐抢,適用于商業(yè)信息的加密现使。HTTPS和SSL支持使用X.509數(shù)字認(rèn)證】
由于https 要還密鑰和確認(rèn)加密算法的需要.單握手就需要6/7 個往返;接下來才是具體的http協(xié)議,每一次響應(yīng)或者請求, 都要求客戶端和服務(wù)端對會話的內(nèi)容做加密/解密旷痕。=》所以對帶寬及cpu都有壓力
前端安全性問題:
XSS碳锈,跨站腳本攻擊(Cross Site Script) 。它指的是惡意攻擊者往Web頁面里插入惡意html代碼欺抗,當(dāng)用戶瀏覽該頁之時售碳,嵌入的惡意html代碼會被執(zhí)行。如:彈出廣告
CSRF绞呈,跨站點(diǎn)偽造請求(Cross Site Request Forgery)贸人。顧名思義就是 通過偽造連接請求在用戶不知情的情況下,讓用戶以自己的身份來完成攻擊者需要達(dá)到的一些目的佃声。如:釣魚網(wǎng)站
cookie劫持艺智,通過獲取頁面的權(quán)限,在頁面中寫一個簡單的到惡意站點(diǎn)的請求圾亏,并攜帶用戶的cookie十拣。 獲取cookie后通過cookie 就可以直以被盜用戶的身份登錄站點(diǎn)。這就是cookie 劫持志鹃。
nodejs:WWW-Authenticate報頭域
項目升級為https:
由于https的網(wǎng)站內(nèi)嵌其它項目時夭问,要求該項目也是https認(rèn)證的;
需要公網(wǎng)CA證書
ajax
Asynchronous JavaScript and XML弄跌,在服務(wù)器和客戶端之間充當(dāng)了一個緩沖器
原理
- 通過XmlHttpRequest對象來向服務(wù)器發(fā)異步請求甲喝,從服務(wù)器獲得數(shù)據(jù),然后用javascript來操作DOM而局部更新頁面
- 本身繼承了XMLHttpRequest 對象铛只,所有現(xiàn)代瀏覽器均支持 XMLHttpRequest 對象(IE5 和 IE6 使用 ActiveXObject)埠胖,用于在后臺與服務(wù)器交換數(shù)據(jù)
- 由下列技術(shù)組合而成:
- 使用CSS和XHTML來表示糠溜;
- 使用DOM模型來交互和動態(tài)顯示;
- 使用XMLHttpRequest來和服務(wù)器進(jìn)行異步通信直撤;
- 使用javascript來綁定和調(diào)用
$.ajax({
type:'GET', //默認(rèn)get
dataType:'json', //預(yù)期服務(wù)器返回的數(shù)據(jù)類型非竿。如果不指定,jQuery 將自動根據(jù) HTTP 包 MIME 信息來智能判斷
contentType:'application/x-www-form-urlencoded', //發(fā)送信息至服務(wù)器時內(nèi)容編碼類型
url:encodeURI(''), //特殊字符需要編碼
timeout:10000, //設(shè)置請求超時時間(毫秒)谋竖。此設(shè)置將覆蓋全局設(shè)置
data:{}, //post時傳遞數(shù)據(jù)
async: true, //默認(rèn)異步
cache: true,//默認(rèn)值: true红柱,dataType 為 script 和 jsonp 時默認(rèn)為 false。設(shè)置為 false 將不緩存此頁面
sucess:function(data,textStatus){
},
error:function(XMLHttpRequset,textStatus,error){
}
});
-
好處:
- 頁面無刷新蓖乘,異步方式不用打斷用戶的操作锤悄;
- 將一些服務(wù)器的工作轉(zhuǎn)嫁到客戶端;
- 基于標(biāo)準(zhǔn)化的并被廣泛支持的技術(shù)嘉抒,不需要小插件等
-
缺點(diǎn):
- ajax干掉了back按鈕零聚,即對瀏覽器后退機(jī)制的破壞【google通過創(chuàng)建或使用一個隱藏的IFRAME來重現(xiàn)頁面上的變更】;
- ajax的邏輯處理對客戶端的安全掃描隱藏
Ajax不能重定向的問題
-
問題:發(fā)送一個接口請求些侍,接口本身重定向到login界面隶症;browser本身發(fā)送兩次請求,一個是接口的請求岗宣,response中是302狀態(tài)蚂会,一個是重定向的請求,狀態(tài)是200耗式,但不跳轉(zhuǎn)到login
302 Found 是HTTP協(xié)議中的一個狀態(tài)碼(Status Code)胁住,可以簡單的理解為該資源原本確實(shí)存在,但已經(jīng)被臨時改變了位置
原因:默認(rèn)ajax是不支持重定向纽什,因?yàn)閍jax本身就是局部刷新措嵌,不重新加載頁面。導(dǎo)致雖然客戶端接受到了重定向芦缰,并發(fā)出了請求企巢,狀態(tài)碼也是200,但是瀏覽器并沒有跳轉(zhuǎn)
解決:
前端根據(jù)json數(shù)據(jù)自己跳轉(zhuǎn)login
java的重定向:
- 當(dāng)使用轉(zhuǎn)發(fā)forward時让蕾,JSP容器將使用一個內(nèi)部的方法來調(diào)用目標(biāo)頁面浪规,新的頁面繼續(xù)處理同一個請求,而瀏覽器將不會知道這個過程探孝;直接經(jīng)由server完成不同url訪問
RequestDispatcher rd = request.getRequestDispatcher("/error.jsp");
try {
rd.forward(request, response);
return; //如果不加笋婿,會報Cannot forward after response has been committed
}catch(Exception e){
}
- 重定向方式的含義是第一個頁面通知瀏覽器發(fā)送一個新的頁面請求
httpServletResponse.sendRedirect(url);
- sendRedirect轉(zhuǎn)發(fā)更快,而且能保持request內(nèi)的對象=》可以解決頁面session傳遞問題顿颅;兩者在調(diào)用它們之前缸濒,都不能有內(nèi)容已經(jīng)被實(shí)際輸出到了客戶端。如果緩沖區(qū)中已經(jīng)有了一些內(nèi)容,這些內(nèi)容將被從緩沖區(qū)中清除
跨域
同源策略的限制庇配。一般為了安全型斩跌,要求在域域名、端口號捞慌、協(xié)議上是一致的
不會判斷是否是同一個ip
但限制了注入iframe和ajax的應(yīng)用耀鸦,需要跨域訪問
- js跨域訪問方式:
使用document.domian來跨域
jsonp
JSON with Padding,動態(tài)創(chuàng)建script啸澡;同源策略不禁止在頁面中引用其他域的JS文件袖订,并可以自由執(zhí)行引入的JS文件中的function(包括操作cookie、Dom等等)
- 示例:
function jsonpCallback(result) {
//alert(result);
for(var i in result) {
alert(i+":"+result[i]);//循環(huán)輸出a:1,b:2,etc.
}
}
var JSONP=document.createElement("script");
JSONP.type="text/javascript";
JSONP.src="http://crossdomain.com/services.php?callback=jsonpCallback"; //客戶端注冊一個jsonp嗅虏,將callback名字傳遞給服務(wù)器
document.getElementsByTagName("head")[0].appendChild(JSONP); //將該源像web中元素引入
//服務(wù)器端以js語法創(chuàng)建callback函數(shù)
- 缺點(diǎn):1洛姑、需要前后端協(xié)作;2旋恼、url使用相對路徑吏口;3奄容、jsonp是get形式冰更,承載的信息量有限
使用window.name進(jìn)行跨域數(shù)據(jù)傳輸
CORS
Cross-origin resource sharing 定義一種跨域訪問的機(jī)制,可以讓AJAX實(shí)現(xiàn)跨域訪問
實(shí)現(xiàn)此功能非常簡單昂勒,只需由服務(wù)器發(fā)送一個響應(yīng)標(biāo)頭即可蜀细;但需要特定瀏覽器支持
支持的瀏覽器:
后臺設(shè)置:
1、
((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin","*"); //cy:調(diào)試階段戈盈,后期去掉
((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"); //解決application/x-www-form-urlencoded, multipart/form-data, or text/plain跨域問題
//或者指定域名
response.setHeader("Access-Control-Allow-Origin","name");
2奠衔、Spring MVC 4.2.5以后新增的支持跨域的注解@CrossOrigin
- 限制:
- 只能使用ajax請求,而不是form中action
-
Access-Control-Allow-Origin: *
允許任何來自任意域的跨域請求塘娶,那么久存在被 DDoS攻擊的可能
超時重試
如果應(yīng)用不設(shè)置超時归斤,則可能會導(dǎo)致請求響應(yīng)慢,慢請求累積導(dǎo)致連鎖反應(yīng)刁岸;
重試次數(shù)太多會導(dǎo)致多倍請求流量脏里,即模擬了DDoS攻擊;讀服務(wù)天然適合重試虹曙,但寫服務(wù)大多不能重試
在進(jìn)行代碼Review時迫横,一定記得Review超時與重試機(jī)制
可能出現(xiàn)的超時節(jié)點(diǎn):
- 代理層超時與重試:如Haproxy、Nginx酝碳、Twemproxy矾踱,這些組件實(shí)現(xiàn)代理功能,如Haproxy和Nginx可以實(shí)現(xiàn)請求的負(fù)載均衡
- Web容器超時:如Tomcat疏哗、Jetty等呛讲,提供HTTP服務(wù)運(yùn)行環(huán)境的
- 中間件客戶端超時與重試:如JSF(京東SOA框架)、Dubbo、JMQ(京東消息中間件)
- 數(shù)據(jù)庫客戶端超時:如Mysql贝搁、Oracle刃宵,需要分別設(shè)置JDBC Connection、Statement的網(wǎng)絡(luò)連接/讀/寫超時時間徘公。事務(wù)超時時間牲证,獲取連接池連接等待時間
- 前端Ajax超時:瀏覽器通過Ajax訪問時的網(wǎng)絡(luò)連接/讀/寫超時時間
問題:
新平臺(端口彼此獨(dú)立,不共享session)关面,后端接收到兩次請求坦袍,第1次是有session情況,第2次是訪問另外的端口跳轉(zhuǎn)到login界面(確定是filter中轉(zhuǎn)的)解決:
- 反向代理Nginx的配置
增加配置:
proxy_next_upstream http_502 http_504 error timeout invalid_header; #表示對error和timeout的進(jìn)行重試到下一個節(jié)點(diǎn)
proxy_read_timeout 60s; #連接成功后等太,后端服務(wù)器響應(yīng)時間(代理接收超時時間)
proxy_send_timeout 60; #后端服務(wù)器數(shù)據(jù)回傳時間(代理發(fā)送超時時間)
proxy_connect_timeout:75; #nginx連接后端的超時時間捂齐,一般不超過75s
- weblogic超時設(shè)置
一、web.xml
設(shè)置WEB應(yīng)用程序描述符web.xml里的<session-timeout>元素缩抡。這個值以分鐘為單位奠宜,并覆蓋weblogic.xml中的TimeoutSecs屬性,此例表示Session將在54分鐘后過期瞻想。
<session-config>
<session-timeout>54</session-timeout>
</session-config>
當(dāng)<session-timeout>設(shè)置為-2压真,表示將使用在weblogic.xml中設(shè)置的TimeoutSecs這個屬性值。
當(dāng)<session-timeout>設(shè)置為-1蘑险,表示Session將永不過期滴肿,而忽略在weblogic.xml中設(shè)置的TimeoutSecs屬性值。該屬性值可以通過console控制臺來設(shè)置
二佃迄、weblogic.xml
設(shè)置WebLogic特有部署描述符weblogic.xml的<session-descriptor>元素的TimeoutSecs屬性泼差。這個值以秒為單位。該文件放在項目的web-inf下呵俏。
<session-descriptor>
<session-param>
<param-name>TimeoutSecs</param-name>
<param-value>3600</param-value>
</session-param>
</session-descriptor>
默認(rèn)值是3600秒
客戶端超時設(shè)置
Connection: keep-alive
每次http請求都要創(chuàng)建一個連接堆缘,而創(chuàng)建連接的過程需要消耗資源和時間,為了減少資源消耗普碎,縮短響應(yīng)時間吼肥,就需要重用連接;Keep-Alive: timeout=time
随常,即告知客戶端長連接超時時間
http/1.0默認(rèn)是關(guān)閉長連接的潜沦,需要添加HTTP請求頭“Connection:Keep-Alive”才能啟用。而http/1.1默認(rèn)啟用長連接绪氛,需要添加HTTP請求頭“Connection: close”才關(guān)閉ajax超時設(shè)置
Ajax 請求是限時的唆鸡,所以錯誤警告被捕獲并處理后,可以用來提升用戶體驗(yàn)枣察。請求超時這個參數(shù)通常就保留其默認(rèn)值争占,要不就通過 jQuery.ajaxSetup 來全局設(shè)定燃逻,很少為特定的請求重新設(shè)置 timeout 選項