目錄:javascript
如何保持登錄狀態?css
Ajax原生html
若是頁面初始載入的時候把ajax請求返回的數據存在localStorage裏面,而後每次調用的時候去localStorage裏面取數,是否可行。vue
304是什麼意思?html5
強緩存和協商緩存的命中和管理java
http請求和響應的消息結構node
http請求頭有哪些字段react
答: Cookie是能夠覆蓋的,若是重複寫入同名的Cookie,那麼將會覆蓋以前的Cookie
若是要刪除某個Cookie,只須要新建一個同名的Cookie,並將maxAge設置爲0,並添加到response中覆蓋原來的Cookie。注意是0而不是負數。負數表明其餘的意義。
localStorage存儲在一個對象中. 有鍵值對
答: 把登陸信息如帳號、密碼等保存在Cookie中,並控制Cookie的有效期,下次訪問時再驗證Cookie中的登陸信息便可。
保存登陸信息有多種方案。最直接的是把用戶名與密碼都保持到Cookie中,下次訪問時檢查Cookie中的用戶名與密碼,與數據庫比較。這是一種比較危險的選擇,通常不把密碼等重要信息保存到Cookie中。
還有一種方案是把密碼加密後保存到Cookie中,下次訪問時解密並與數據庫比較。這種方案略微安全一些。若是不但願保存密碼,還能夠把登陸的時間戳保存到Cookie與數據庫中,到時只驗證用戶名與登陸時間戳就能夠了。
這幾種方案驗證帳號時都要查詢數據庫。
//**********第一步, 得到一個xhr對象************* var xmlHttpReq = null; //聲明一個空對象用來裝入XMLHttpRequest if (window.ActiveXObject){//IE5 IE6是以ActiveXObject的方式引入XMLHttpRequest的 xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest){//除IE5 IE6 之外的瀏覽器XMLHttpRequest是window的子對象 xmlHttpReq = new XMLHttpRequest();//實例化一個XMLHttpRequest } if(xhr != null){ //若是對象實例化成功 //設置回調函數 xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ //肯定響應已經成功返回 //200可做爲成功標誌, 304表示請求資源沒有修改, 可直接使用瀏覽器緩存 if ((xhr.status>=200 && xhr.status < 300 ) || xhr.status == 304){ alert(xhr.responseText); } else { alert( " Request was unsuccessful: " + xhr.status); } } } //************第二步: 啓動請求.****************** //open方法接收三個參數: 要發送的請求類型(get,post等), 請求的url和是否異步發送請求的布爾值 xhr.open("get","test.php",true); //調用open()方法並採用異步方式. 若是第三個參數是false, 同步執行, 則js代碼會等到服務器響應以後再繼續執行 //*************第三步: 發送數據******************* //send方法接收一個參數,即要做爲請求主體發送的數據. 若是不須要經過請求主體發送數據, 則必須傳入null. 由於這個參數對有些瀏覽器是必須的 xhr.send(null); //由於使用get方式提交,因此能夠使用null參調用 // 若是要設置請求頭部信息,必須在調用open()方法以後且調用send()方法以前調用setRequestHeader()
參考:《JavaScript》高級程序設計第21章:Ajax和Comet,jsonp
答: 動態添加一個<script>標籤,而script標籤的src屬性是沒有跨域的限制的。
首先在客戶端註冊一個callback, 而後把callback的名字傳遞給服務器. 服務端獲得請求的數據後, 要用callback把要輸出返回的內容包起來, 這樣, 服務器生成的json數據就能被客戶端正確接收了.
而後以js語法的方式,生成一個function, function的名字就是傳遞上來的參數callback方法的名字
最後將json數據直接以入參的方式, 放置到function中, 這樣就生成了一段js語法的文檔, 返回給客戶端.
客戶端瀏覽器, 解析script標籤,. 並執行返回的js文檔, 此時js文檔數據做爲參數, 傳遞到了客戶端預先定義好的callback函數裏.
參考: JSONP跨域的原理解析
舉個栗子:
<script type="text/javascript"> function jsonpCallback(result) { alert(result.msg); } </script> <script type="text/javascript" src="http://crossdomain.com/jsonServerResponse?jsonp=jsonpCallback"></script>
其中jsonCallback是客戶端註冊的,獲取跨域服務器上的JSON數據後,回調的函數。http://crossdomain.com/jsonServerResponse?jsonp=jsonpCallback 這個url是跨域服務器取JSON數據的接口,參數爲回調函數的名字,返回的格式爲: jsonpCallback({msg:'this is json data'}) 。如此就生成了一段js語法的文檔, 傳回客戶端就能夠調用jsonpCallBack函數了.
因此這裏也能夠看到, 回調函數應當是定義在全局的?
(直接說了不能保證數據的實時性,請求和實時性必然會有一方有所犧牲)
答: 304表示請求資源沒有修改, 能夠直接使用瀏覽器緩存.
答:
【Last-Modified,If-Modified-Since】的控制緩存的原理是:
瀏覽器第一次跟服務器請求一個資源,服務器在返回這個資源的同時,在respone的header加上Last-Modified的header,這個header表示這個資源在服務器上的最後修改時間
瀏覽器再次跟服務器請求這個資源時,在request的header上加上If-Modified-Since的header,這個header的值就是上一次請求時返回的Last-Modified的值:
服務器再次收到資源請求時,根據瀏覽器傳過來If-Modified-Since和資源在服務器上的最後修改時間判斷資源是否有變化,若是沒有變化則返回304 Not Modified,可是不會返回資源內容;若是有變化,就正常返回資源內容。當服務器返回304 Not Modified的響應時,response header中不會再添加Last-Modified的header,由於既然資源沒有變化,那麼Last-Modified也就不會改變,這是服務器返回304時的response header:
瀏覽器收到304的響應後,就會從緩存中加載資源。
若是協商緩存沒有命中,瀏覽器直接從服務器加載資源時,Last-Modified Header在從新加載的時候會被更新,下次請求時,If-Modified-Since會啓用上次返回的Last-Modified值。
【ETag、If-None-Match】: 【Last-Modified,If-Modified-Since】都是根據服務器時間返回的header,通常來講,在沒有調整服務器時間和篡改客戶端緩存的狀況下,這兩個header配合起來管理協商緩存是很是可靠的,可是有時候也會服務器上資源其實有變化,可是最後修改時間卻沒有變化的狀況,而這種問題又很不容易被定位出來,而當這種狀況出現的時候,就會影響協商緩存的可靠性。因此就有了另一對header來管理協商緩存,這對header就是【ETag、If-None-Match】。它們的緩存管理的方式是:
瀏覽器第一次跟服務器請求一個資源,服務器在返回這個資源的同時,在respone的header加上ETag的header,這個header是服務器根據當前請求的資源生成的一個惟一標識,這個惟一標識是一個字符串,只要資源有變化這個串就不一樣,跟最後修改時間沒有關係,因此能很好的補充Last-Modified的問題:
瀏覽器再次跟服務器請求這個資源時,在request的header上加上If-None-Match的header,這個header的值就是上一次請求時返回的ETag的值:
服務器再次收到資源請求時,根據瀏覽器傳過來If-None-Match和而後再根據資源生成一個新的ETag,若是這兩個值相同就說明資源沒有變化,不然就是有變化;若是沒有變化則返回304 Not Modified,可是不會返回資源內容;若是有變化,就正常返回資源內容。與Last-Modified不同的是,當服務器返回304 Not Modified的響應時,因爲ETag從新生成過,response header中還會把這個ETag返回,即便這個ETag跟以前的沒有變化
若是資源已經被瀏覽器緩存下來,在緩存失效以前,再次請求時,默認會先檢查是否命中強緩存,若是強緩存命中則直接讀取緩存,若是強緩存沒有命中則發請求到服務器檢查是否命中協商緩存,若是協商緩存命中,則告訴瀏覽器仍是能夠從緩存讀取,不然才從服務器返回最新的資源。這是默認的處理方式
如下行爲可能改變緩存的默認處理方式
當ctrl+f5強制刷新網頁時,直接從服務器加載,跳過強緩存和協商緩存;
當f5刷新網頁時,跳過強緩存,可是會檢查協商緩存;
參考: 瀏覽器緩存知識小結及應用by 流雲諸葛
答:
實例見下一題.
url在請求行, cookie在請求頭
參考: HTTP請求報文解剖
答:
http請求和http響應都使用頭髮送有關http消息的信息. 頭由一系列行組成, 每行都包含名稱, 而後依次是冒號, 空格, 值. 字段可按任何順序排列. 某些頭字段既能夠用於請求頭也能夠用於響應頭, 而另外一些字段只能使用其中之一.
許多請求字段都容許客戶端在值部分指定多個可接收的選項, 有時甚至能夠對這些選項的首選項進行排名. 多個項以逗號分隔. 例如, 客戶端能夠發送包含"Content-Encoding: gzip, compress"的請求頭, 表示能夠接受各類壓縮類型. 若是服務器的響應正文使用gzip編碼,其響應頭中將包含"Content-Encoding: gzip".
有些字段能夠在單個頭中出現屢次, 例如, 頭能夠有多個"Warning"字段.
下表列出了http1.1頭字段. 注意, 有些頭字段是mime字段. mime字段在ietf文檔rfc2045中進行了定義, 但也可用於http1.1協議.
Cache-Control | 指定請求和響應遵循的緩存機制. 請求消息或響應消息中設置Cache-Control並不會修改另外一個消息處理過程只能怪的緩存處理過程 | "max-age=10" or "no-cache" or "no-store" |
Connection | 處理完此次請求後是否斷開鏈接仍是繼續保持鏈接 | "close" or "Keep-Alive" |
Date | 表示消息發送的時間. 時間的描述格式由rfc822定義 | "Tue, 11 Jul 2000 18:23:51 GMT" |
Pragma | 用來包含實現特殊的指令 知道"no-cache"值表示服務器必須返回一個刷新後的文檔, 即便它是代理服務器並且已經有了頁面的本地拷貝 |
"no-cache"(與設置Cache-Control: no-cache相同) |
Trailer | "Date" | |
Transfer-Encoding | "chuncked" | |
Upgrade | 向服務器指定某種傳輸協議以便服務器進行轉換(若是支持) | "SHTTP/1.3" |
Via | 通知中間網關或代理服務器地址, 通訊協議 | "HTTP/1.1 Proxy1, HTTP/1.1 Proxy2" |
Warning | 關於實體消息的警告細心 | "112 Disconnected Operation" |
請求消息的第一行格式爲:
Method SP Request-URI SP HTTP-Version CRLF
請求頭域: 容許客戶端向服務器傳遞關於請求或者關於客戶機的附加信息.
Accept | 瀏覽器可以處理的內容類型. | "text/html, iamge/*" |
Accept-Charset | 告訴服務器, 客戶端採用的編碼格式/字符集 | "iso8859-5" |
Accept-Encoding | 告訴服務器, 客戶機支持的數據壓縮格式 | "gzip, compress" |
Accept-Language | 客戶機的語言環境 | "en, fr" |
Authorization | 受權信息., 一般出如今對服務器發送的WWW-Authenticate頭的應答中 | [credentials] |
Content-Encoding | "gzip" | |
Expect | "100-continue" | |
From | 請求發送者的email地址, 由一些特殊的web客戶程序使用, 瀏覽器不會用到 | "user@microsoft.com" |
Host | 客戶機想訪問的主機名. 即指定資源的internet主機和端口號. 必須表示請求url的原始服務器或網關的位置, http/1.1 請求必須包含主機頭域, 不然系統會以400狀態碼返回 | "www.microsoft.com" |
If-Match | "entity_tag001" | |
If-Modified-Since | 資源的緩存時間. 只有當所請求的內容在指定的日期以後又通過修改才返回它, 不然返回304 "Not Modified" 應答 | "Tue, 11 Jul 2000 18:12:12 GMT" |
If-None=Match | "entity_tag001" | |
If-Range | "entity_tag001" or "Tue, 11 Jul 2000 18:12:12 GMT" | |
If-Unmodified-Since | "Tue, 11 Jul 2000 18:12:12 GMT" | |
Max-Forwards | "3" | |
Proxy-Authorization | [credentials] | |
Range | 請求實體的一個或者多個子範圍. 如示例即表示請求100-599個字節. 可是服務器能夠忽略此請求頭, 若是無條件get包含range請求頭, 響應會以狀態碼206返回而不是200 |
"bytes=100-599" |
Referer | 告訴服務器, 客戶端是從哪一個資源來訪問服務器的(防盜鏈) | "http://www.microsoft.com/resources.asp" |
TE | 客戶端願意接受的傳輸編碼, 並通知服務器接受接受尾加頭信息 | "trailers" |
User-Agent | 客戶機的軟件環境, 瀏覽器類型 | "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)" |
響應消息的第一行爲下面的格式
HTTP-Version SP Status-Code SP Reason-Phrase CRLF
Accecpt-Ranges | 表面服務器是否支持指定範圍請求及哪一種類型的分段請求 | "none" |
Age | 從原始服務器到代理緩存造成的估算時間(以秒記, 非負) | "2147483645(2^31)" |
ETag | 緩存相關的頭 | "b38b9-17dd-367c5dcd" |
Last-Modified | 請求資源的最後修改時間 | "Tue, 11 Jul 2000 18:23:51 GMT" |
Location | 配合302狀態碼使用, 用於告訴客戶找誰 | "http://localhost/redirecttarget.asp" |
Proxy-Authenticate | 指出認證方案和可應用到代理的該url上的參數 | [challenge] Proxy-Authenticate: Basic |
Retry-After | "Tue, 11 Jul 2000 18:23:51 GMT" or "60" | |
Server | 服務器經過這個告訴瀏覽器數據的服務器的類型 | "Microsoft-IIS/5.0" |
Vary | "Date" | |
WWW-Authenticate | [challenge] |
請求消息和響應消息均可以包含實體信息. 實體信息通常是由實體頭域和實體組成. 實體頭域包含關於實體的原信息.實體能夠是一個通過編碼的字節流. 其編碼方式由Content-Encoding和content-Type定義. 長度由Content-Length或Content-Range定義.
實體頭字段:實體頭字段能夠用於請求消息或響應消息. 實體頭字段中包含消息實體正文的有關信息, 如使用的編碼格式
Allow | "GET, HEAD" | |
Content-Encoding | 數據的壓縮格式 | "gzip" |
Content-Language | "en" | |
Content-Length | 請求消息正文的長度 | "8445" |
Content-Location | "http://localhost/page.asp" | |
Content-MD5 | [md5-digest] | |
Content-Range | 用於指定整個實體中的一部分的插入位置, 也指示了整個實體的長度. 在服務器向客戶返回一個部分響應,它必須描述響應覆蓋的範圍和整個實體長度 | "bytes 2543-4532/7898" |
Content-Type | 數據的類型. 指定head方法送到接收方的實體介質類型, 或get方法發送的請求介質類型Content-Range實體頭 | "text/html" |
Expires | 告訴瀏覽器把回送的資源緩存多長時間 -1或0則是不緩存. 即應該在何時認爲文檔已通過期, 從而再也不緩存它 |
"Tue, 11 Jul 2000 18:12:12 GMT" |
Last-Modified | 當前資源的最後緩存時間. 即服務器上保存內容的最後修訂時間. 客戶能夠經過If-Modified-Since請求頭提供一個日期, 該請求將被視爲一個條件get, 只有改動時間遲於指定時間的文檔纔會返回, 不然返回一個304(Not Modified)狀態 | "Tue, 11 Jul 2000 18:12:12 GMT" |
表明服務器向客戶端回送的數據
GET /articles/news/today.asp HTTP/1.1
Accept: */*
Accept-Language: en-us
Connection: Keep-Alive
Host: localhost
Referer: http://localhost/links.asp
User-Agent: Mozilla/4.0 (compatible; MSIE 3.5; Windows NT 5.0)
Accept-Encoding: gzip, deflate
該請求具備請求行, 其中包括方法(GET), 資源路徑(/articles/news/today.asp)和http版本(http/1.1). 因爲該請求沒有正文, 故全部請求行後面的內容都是頭的一部分. 緊接着頭以後是一個空行, 表示頭已結束.
Web服務器能夠經過多種方式響應前一個請求, 假設文件是能夠訪問的, 而且用戶具備查看該文件的權限, 則響應相似於:
HTTP/1.1 200 OK Server: Microsoft-IIS/5.0 Date: Thu, 13 Jul 2000 05:34:32 GMT Content-Length: 2291 Content-Type: text/html Set-Cookie: ASPSESSIONIDQQGGGNCG=LKLDFFKCINFLDMFHCBCBMFLJ; path=/ Cache-control: private <HTML> <BODY> ...
響應的第一行稱爲狀態行. 它包含響應所用的http版本, 狀態編碼(200)和緣由短語. 示例中包含一個頭, 其中具備五個字段, 接着是一個空行(回車和換行符), 而後是響應正文的頭兩行.
參考: HTTP頭參考 HTTP協議---HTTP請求中的經常使用請求字段和HTTP的響應狀態碼及響應頭 HTTP頭字段
經常使用:
答:
答:
關於以上緩存機制的優先級:
Cache-Control > Expires : 前者設置更詳細
Cache-Control/Expires > Last-Modified/ETag : 本地副本根據Cache-Control/Expires還在有效期內, 則不會在此發送請求去服務器詢問修改時間或實體標識了
即最前面的最重要, 前面的生效後, 後面的基本就失效了
ETag默認是須要要源網站確認的, 由於要確認是否匹配. 而Last-Modified默認是不向源服務器確認的
在大型多web集羣時, 使用ETag有問題. 由於多服務器時INode不同, 因此不一樣的服務器生成的ETag不同, 因此用戶有可能重複下載(這時ETag就會不許).
若是服務器端同時設置了ETag和Expires時, ETag原理一樣, 即與Last-Modified/ETag對應的HttpRequest Header: If-Modified-Since和If-None-Match. 則在徹底匹配If-Modified-Since和If-None-Match即檢查完修改時間和ETag後, 服務器才能返回304;
若是服務器又設置了Cache-Control:max-age和Expires時, 也是同時使用.(究竟是同時使用仍是如上所述前者大於後者?)
通常狀況下, 使用Cache-Control/ Expires 會配合Last-Modified/ETag一塊兒使用, 由於即便在服務器設置緩存時間, 當用戶點擊"刷新"按鈕時, 瀏覽器會忽略緩存繼續向服務器發送請求, 這是後者就能夠很好利用304, 從而減小響應開銷
ETag是服務器自動生成或者或者由開發者生成的對應資源在服務器端的惟一標識符, 可以更加準確的控制緩存. Last-Modified和ETag是能夠一塊兒使用的, 服務器會優先驗證ETag, 一致的狀況下, 纔會繼續比對Last-Modified, 最後才決定返回304.
用戶操做和緩存的關係
用戶操做 | Cache-Control/Expires | Last-Modified/ETag |
地址欄回車 | 有效 | 有效 |
頁面連接調整 | 有效 | 有效 |
新開窗口 | 有效 | 有效 |
前進後退 | 有效 | 有效 |
F5刷新 | 無效 | 有效 |
Ctrl+F5 | 無效 | 無效 |
參考: 有關客戶端瀏覽器緩存的Http頭介紹 HTTP緩存相關的概念 http請求頭信息 http響應頭信息 expires與etag控制頁面緩存的優先級
答:
js語言的執行環境是單線程, 一次只能完成一個任務, 若是有多個任務則須要排隊. 因而, js將任務的執行模式分爲兩種: 同步(Sychronous)和異步(Asynchronous).同步就是後一段等前一個任務執行結束再執行, 異步模式則是: 每個任務有一個回調函數, 前一個任務結束後, 不是執行後一個任務,而是執行回調函數, 後一個任務則是不等前一個任務執行完畢就執行, 因此程序的執行順序與任務的排序順序是不一致的, 異步的.
異步的方法:
答:
答: 應該是請求實體吧
答: 創建TCP鏈接須要三次握手, 而斷開鏈接須要執行四次揮手.
1)用戶輸入網址
2)瀏覽器經過DNS獲取網站的IP地址。客戶端先檢查本地是否有對應的IP地址,若找到則返回響應的IP地址。若沒找到則請求上級DNS服務器,直至找到或到根節點。
DNS查找IP地址的順序: 瀏覽器緩存、系統緩存、互聯網服務提供商(ISP)的DNS緩存、遞歸搜索(從瀏覽器緩存開始,若是沒找到就繼續往下一個找。)找到後,瀏覽器會得到一個IP地址。
3)瀏覽器客戶端發送http請求
HTTP請求包括請求報頭和請求主體兩個部分,其中請求報頭包含了相當重要的信息,包括請求的方法(GET / POST)、目標url、遵循的協議(http / https / ftp…),返回的信息是否須要緩存,以及客戶端是否發送cookie等。
4)傳輸層TCP傳輸報文。TCP協議經過「三次握手」等方法保證傳輸的安全可靠。
5)網絡層IP協議查詢MAC地址
IP協議的做用是把TCP分割好的各類數據包傳送給接收方。而要保證確實能傳到接收方還須要接收方的MAC地址,也就是物理地址。IP地址和MAC地址是一一對應的關係,一個網絡設備的IP地址能夠更換,可是MAC地址通常是固定不變的。ARP協議能夠將IP地址解析成對應的MAC地址。當通訊的雙方不在同一個局域網時,須要屢次中轉才能到達最終的目標,在中轉的過程當中須要經過下一個中轉站的MAC地址來搜索下一個中轉目標。
7)數據到達數據鏈路層
在找到對方的MAC地址後,就將數據發送到數據鏈路層傳輸。這時,客戶端發送請求的階段結束
8)服務器接收數據
接收端的服務器在鏈路層接收到數據包,再層層向上直到應用層。這過程當中包括在運輸層經過TCP協議將分段的數據包從新組成原來的HTTP請求報文。
9)服務器響應請求
服務接收到客戶端發送的HTTP請求後,查找客戶端請求的資源,並返回響應報文,響應報文中包括一個重要的信息——狀態碼。狀態碼由三位數字組成,其中比較常見的是200 OK表示請求成功。301表示永久重定向,即請求的資源已經永久轉移到新的位置。在返回301狀態碼的同時,響應報文也會附帶重定向的url,客戶端接收到後將http請求的url作相應的改變再從新發送。404 not found 表示客戶端請求的資源找不到。
10)服務器返回響應文件
請求成功後,服務器會返回相應的HTML文件。接下來就到了頁面的渲染階段了。
11) 頁面渲染: 解析HTML以構建DOM樹 –> 構建渲染樹 –> 佈局渲染樹 –> 繪製渲染樹。
關於頁面渲染過程:
1)解析HTML代碼,生成一棵DOM樹
2)解析CSS文件
3)生成渲染樹(受樣式影響,包含不可見元素)
4)渲染樹中的節點
DOM樹是由HTML文件中的標籤排列組成,渲染樹是在DOM樹中加入CSS或HTML中的style樣式而造成。渲染樹只包含須要顯示在頁面中的DOM元素,像<head>元素或display屬性值爲none的元素都不在渲染樹中。
在瀏覽器還沒接收到完整的HTML文件時,它就開始渲染頁面了,在遇到外部鏈入的腳本標籤或樣式標籤或圖片時,會再次發送HTTP請求重複上述的步驟。在收到CSS文件後會對已經渲染的頁面從新渲染,加入它們應有的樣式,圖片文件加載完馬上顯示在相應位置。在這一過程當中可能會觸發頁面的重繪或重排。
答:
關於加載順序:
<link href="" />
這種形式,內部<style></style>
這種樣式定義,在考慮阻塞時也要考慮
主要解析過程:
參考: 瀏覽器~加載, 解析, 渲染 瀏覽器加載和渲染html的順序
cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙
考慮到安全應當使用session。
session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能
考慮到減輕服務器性能方面,應當使用COOKIE。
單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。
因此建議是:
將登錄信息等重要信息存放爲SESSION
其餘信息若是須要保留,能夠放在COOKIE中
同步:腳本會停留並等待服務器發送回覆而後再繼續。提交請求->等待服務器處理->處理完畢返回,這個期間客戶端瀏覽器不能幹任何事。
異步:腳本容許頁面繼續其進程並處理可能的回覆。請求經過事件觸發->服務器處理(這是瀏覽器仍然能夠做其餘事情)->處理完畢
若要在使用ajax請求後處理髮送請求返回的結果,最好使用同步請求。
1
2
3
|
HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value; expires=失效時間; domain=域名
|
Cookie由變量名和值組成, 其屬性中既有標準的Cookie變量, 也有用戶本身建立的變量,屬性中變量是用"變量=值"形式來保存
Cookie格式以下:
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
Set-Cookie: NAME=VALUE;
Expires=DATE[有效終止日期];
Path=PATH[Path屬性定義了Web服務器上哪些路徑下的頁面可獲取服務器設置的Cookie];
Domain=DOMAIN_NAME;
SECURE[在Cookie中標記該變量,代表只有當瀏覽器和Web Server之間的通訊協議爲加密認證協議時,瀏覽器才向服務器提交相應的Cookie。當前這種協議只有一種,即爲HTTPS]
參考: Cookie的組成
答:
sessionStorage 和 localStorage 是HTML5 Web Storage API 提供的,這兩種方式都容許開發者使用js設置的鍵值對進行操做,在在從新加載不一樣的頁面的時候讀出它們。這一點與cookie相似。能夠方便的在web請求之間保存數據。有了本地數據,就能夠避免數據在瀏覽器和服務器間沒必要要地來回傳遞。
sessionStorage、localStorage、cookie都是在瀏覽器端存儲的數據, 其中sessionStorage的概念很特別,引入了一個「瀏覽器窗口」的概念。
sessionStorage是在同源的同學口(或tab)中,始終存在的數據。也就是說只要這個瀏覽器窗口沒有關閉,即便刷新頁面或進入同源另外一頁面,數據仍然存在。關閉窗口後,sessionStorage即被銷燬。同時「獨立」打開的不一樣窗口,即便是同一頁面,sessionStorage對象也是不一樣的。
Web Storage 數據徹底存儲在客戶端, 不須要經過瀏覽器的請求將數據傳給服務器, 所以比cookies可以存儲更多的數據,大概5M左右
Web Storage帶來的好處:
使用 local storage和session storage主要經過在js中操做這兩個對象來實現,分別爲window.localStorage和window.sessionStorage. 這兩個對象均是Storage類的兩個實例,天然也具備Storage類的屬性和方法。
減小網絡流量:一旦數據保存在本地後,就能夠避免再向服務器請求數據,所以減小沒必要要的數據請求,減小數據在瀏覽器和服務器間沒必要要地來回傳遞。
快速顯示數據:性能好,從本地讀數據比經過網絡從服務器得到數據快得多,本地數據能夠即時得到。再加上網頁自己也能夠有緩存,所以整個頁面和數據都在本地的話,能夠當即顯示。
臨時存儲:不少時候數據只須要在用戶瀏覽一組頁面期間使用,關閉窗口後數據就能夠丟棄了,這種狀況使用sessionStorage很是方便。
答:
js跨域是由於同源策略致使的。解決方法有:
js:
1. 原生js添加class怎麼添加,若是自己已經有class了,會不會覆蓋,怎麼保留?
參考:
原生JS實現addClass,removeClass,toggleClass
2. 事件代理js實現
3. requireJS的原理是什麼
4. 數組去除一個函數。用arr.splice。又問splice返回了什麼?應該返回的是去除的元素。
5. commonJS和AMD。
6. 對象中key-value的value怎麼再放一個對象。(直接放也能夠,轉成json字符串存數,讀取再解析)
CSS
1. CSS實現動畫效果
2. Animation還有哪些其餘屬性?
3. CSS實現三列布局
4. CSS實現保持長寬比1:1
參考:
5. CSS實現兩個自適應等寬元素中間空10個像素
6. 浮動的原理以及如何清除浮動
7.
=============================================================
1.css 盒模型
2.css 佈局,左邊定寬右邊自適應。兩種方法,NEC上的用負邊距消除寬度,用彈性佈局。而後問我有沒有第三種。。。
3.冒泡和捕獲,事件流哪三個階段?除了冒泡和捕獲,還有目標階段。他們的前後順序,先捕獲,到了目標,再冒泡。(不要只記概念,要了解是幹麼用的)
4.實現事件代理。用jquery寫了。要求寫原生。子元素傳遞上來的應該是event.target或者e.srcElement。這個強調下IE和W3C的區別,建議寫一個封裝。
5.原型鏈。繼承的兩種方法。原型鏈繼承和類繼承。而後類繼承只繼承了實例屬性,沒有原型屬性。原型鏈繼承能夠繼承全部。而後用apply和call怎麼繼承原型鏈上的共享屬性?經過空函數傳值。新建一個空函數C。C實例化後C的實例屬性就是空,而後用B的apply/call去繼承C,至關於繼承了C的實例屬性。
7,閉包。簡單說一個閉包的應用。而後閉包的主要做用是什麼:封裝!
二面:
1.css:兩個塊狀元素上下的margin-top和margin-bottom會重疊。啥緣由?怎麼解決?(應該給父類元素添加BFC)
2.js:寫一個遞歸。就是每隔5秒調用一個自身,一共100次。
=============================================================
挖財 面 9.10(2輪技術面,1個多小時,沒有HR面,沒有offer。)
一面:
你對組件的理解
組件的html怎麼進行管理
less和sass用過麼
nodejs用過麼
js的異步加載,promise的三種狀態,ES7中的async用過麼
js原型鏈的繼承
靜態屬性怎麼繼承
jquery和zepto有什麼區別
angular的雙向綁定原理
angular和react的認識(挖財用這個兩個框架,後來問了)
MVVM是什麼
二面:
適配有去考慮麼,retina屏幕啊?
rem是什麼?em是什麼?若是上一層就是根root了,em和rem等價麼?
二面面試官給個人感受不好,那我面的也很消極,而後跪了瓜熟蒂落。
1.怎麼獲得一個頁面的a標籤(就說了getElementByTagName和選擇器)
2.怎麼在頁面裏放置一個很簡單的圖標,不能用img和background-img
(說了canvas,或者一些庫有icon庫,data-icon).
3.正則表達式判斷url(只寫了判斷是不是http或者https開頭)
4.怎麼去除字符串先後的空格(正則匹配^\s和\s$而且替代,Jquery的$.trim,string.trim())
5.實現頁面的局部刷新
題目參考: