-1 web Client 向servlet服務器,發出Http請求
-2 servlet接受web Client的請求
-3 servlet容器創建一個HttpRequest 對象,將Web Client請求的信息封裝到這個對象中
-4 servlet容器創建一個HttpResponset對象
-5 servlet容器調用HttpServlet對象的service方法,把HttpRequest對象與HttpResponse對象作為參數傳給HttpServlet對象
-6 HttpServlet調用HttpRequest對象的有關方法,獲取Http請求信息
-7 HttpServlet調用HttpResponst 對象的有關方法,生成響應數據
-8 Servlet容器把 HttpServlet的響應結果給Web Client
簡單的說:init service destroy
Servlet不是線程安全的,多線程并發的讀寫會導致數據不同步的問題。
解決的辦法是盡量不要在實現servlet接口的類中定義實例變量,而是要把變量分別定義在doGet()和doPost()方法內。雖然使用synchronized(name){}語句塊可以解決問題,但是會造成線程的等待,不是很科學的辦法。
注意:多線程的并發的讀寫Servlet類屬性會導致數據不同步。但是如果只是并發地讀取屬性而不寫入,則不存在數據不同步的問題。因此Servlet里的只讀屬性最好定義為final類型的。
<%@ page isThreadSafe=”false”%>
①get請求用來從服務器上獲得資源,而post是用來向服務器提交數據;
②get將表單中數據按照name=value的形式,添加到action 所指向的URL 后面,并且兩者使用"?"連接,而各個變量之間使用"&"連接;post是將表單中的數據放在HTTP協議的請求頭或消息體中,傳遞到action所指向URL;
③get傳輸的數據要受到URL長度限制(1024字節);而post可以傳輸大量的數據,上傳文件通常要使用post方式;
④使用get時參數會顯示在地址欄上,如果這些數據不是敏感數據,那么可以使用get;對于敏感數據還是應用使用post;
⑤get使用MIME類型application/x-www-form-urlencoded的URL編碼(也叫百分號編碼)文本的格式傳遞參數,保證被傳送的參數由遵循規范的文本組成,例如一個空格的編碼是"%20"。
1.重定向訪問服務器兩次,轉發只訪問服務器一次。
2.轉發頁面的URL不會改變,而重定向地址會改變
3.轉發只能轉發到自己的web應用內,重定向可以重定義到任意資源路徑。
4.轉發相當于服務器跳轉,相當于方法調用,在執行當前文件的過程中轉向執行目標文件,兩個文件(當前文件和目標文件)屬于同一次請求,前后頁 共用一個request,可以通過此來傳遞一些數據或者session信息,request.setAttribute()和 request.getAttribute()。而重定向會產生一個新的request,不能共享request域信息與請求參數。
5.由于轉發相當于服務器內部方法調用,所以轉發后面的代碼仍然會執行(轉發之后記得return);重定向代碼執行之后是方法執行完成之后進行重定向操作,也就是訪問第二個請求,如果是方法的最后一行進行重定向那就會馬上進行重定向(重定向也需要return)。
6.無論是RequestDispatcher.forward方法,還是HttpServletResponse.sendRedirect方法,在調用它們之前,都不能有內容已經被實際輸出到了客戶端。如果緩沖區中已經有了一些內容,這些內容將被從緩沖區中移除。
可以這么理解:轉發相當于,張三向你借錢,但是你兜里沒錢,所以你去找李四借到錢之后借給張三。對于張三而言并不知道你的錢是和李四借的;重定向相當于,張三向你借錢,你兜里沒錢,你告訴他李四有錢,所以張三再次去找李四借錢。
request:封裝客戶端的請求,其中包含來自GET或POST請求的參數;
response:封裝服務器對客戶端的響應;
pageContext:通過該對象可以獲取其他對象;
session:封裝用戶會話的對象;
application:封裝服務器運行環境的對象;
out:輸出服務器響應的輸出流對象;
config:Web應用的配置對象;
page:JSP頁面本身(相當于Java程序中的this);
exception:封裝頁面拋出異常的對象。
JSP中的四種作用域包括page、request、session和application,具體來說:
page代表與一個頁面相關的對象和屬性。
request代表與Web客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個Web組件;需要在頁面顯示的臨時數據可以置于此作用域。
session代表與某個用戶與服務器建立的一次會話相關的對象和屬性。跟某個用戶相關的數據應該放在用戶自己的session中。
application代表與整個Web應用程序相關的對象和屬性,它實質上是跨越整個Web應用程序,包括多個頁面、請求和會話的一個全局作用域。
靜態包含是通過JSP的include指令包含頁面,動態包含是通過JSP標準動作<jsp:forward>包含頁面。靜態包含是編譯時包含,如果包含的頁面不存在則會產生編譯錯誤,而且兩個頁面的"contentType"屬性應保持一致,因為兩個頁面會合二為一,只產生一個class文件,因此被包含頁面發生的變動再包含它的頁面更新前不會得到更新。動態包含是運行時包含,可以向被包含的頁面傳遞參數,包含頁面和被包含頁面是獨立的,會編譯出兩個class文件,如果被包含的頁面不存在,不會產生編譯錯誤,也不影響頁面其他部分的執行。
瀏覽器首先要請求一個以.jsp擴展名結尾的頁面,發起JSP請求,然后,Web服務器讀取這個請求,使用JSP編譯器把JSP頁面轉化成一個Servlet類。需要注意的是,只有當第一次請求頁面或者是JSP文件發生改變的時候JSP文件才會被編譯,然后服務器調用servlet類,處理瀏覽器的請求。一旦請求執行結束,servlet會把響應發送給客戶端。這里看下如何在JSP中獲取請求參數。
1.jsp的本質是Servlet ,jvm只能識別java的類,不能識別jsp的代碼;
2 jsp更擅長表現與頁面顯示,Servlet更擅長與邏輯控制;
3 servlet中沒有內置對象,jsp中有九大內置對象;
過濾器是一個對象,可以傳輸請求或修改響應。它可以在請求到達Servlet/JSP之前對其進行預處理,而且能夠在響應離開Servlet/JSP之后對其進行后處理。所以如果你有幾個Servlet/JSP需要執行同樣的數據轉換或頁面處理的話,你就可以寫一個過濾器類,然后在部署描述文件(web.xml)中把該過濾器與對應的Servlet/JSP聯系起來。你可以一個過濾器以作用于一個或一組servlet,零個或多個過濾器能過濾一個或多個servlet。一個過濾器實現java.servlet.Filter接口并定義它的三個方法:
1.void init(FilterConfig config) throws ServletException:在過濾器執行service前被調用,以設置過濾器的配置對象。
2.void destroy();在過濾器執行service后被調用。
3.void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException;
<c:if>、<c:item>、<c:foreach>、<c:out>、<c:set>
XML 即可擴展標記語言(Extensible Markup language),你可以根據自己的需要擴展 XML。XML 中可以輕松定義<books>, <orders>等自定義標簽,而在 HTML 等其他標記語言中必須使用預定義的標簽,比如<p>,而不能使用用戶定義的標簽。使用 DTD 和 XML Schema 標準化XML 結構。XML 主要用于從一個系統到另一系統的數據傳輸,比如企級應用的客戶端與服務端。
XPath 是用于從 XML 文檔檢索元素的 XML 技術。XML 文檔是結構化的,因此 XPath 可以從 XML 文件定位和檢索元素、屬性或值。從數據檢索方面來說,XPath與 SQL 很相似,但是它有自己的語法和規則。了解更多查看怎樣使用 XPath 從XML文檔中檢索數據。
XML 命名空間與 Java 的 package 類似,用來避免不同來源名稱相同的標簽發生沖突。XML 命名空間在 XML 文檔頂部使用 xmlns 屬性定義,語法為 xmlns:prefix=’URI’。prefix 與XML 文檔中實際標簽一起使用。下面例子為 XML 命名空間的使用。
<root xmlns:inst="http://instruments.com/inst"
<inst:phone>
<inst:number>837363223</inst:number>
</inst:phone>
</root>
解析方式:有 DOM,SAX,STAX 等:
● DOM:處理大型文件時其性能下降的非常厲害。這個問題是由 DOM 的樹結構所造成的,這種結構占用的內存較多,而且 DOM 必須在解析文件之前把整個文檔裝入內存,適合對 XML 的隨機訪問;
● SAX:不同于 DOM,SAX 是事件驅動型的 XML 解析方式。它順序讀取 XML 文件,不需要一次全部裝載整個文件。當遇到像文件開頭,文檔結束,或者標簽開頭與標簽結束時,它會觸發一個事件,用戶通過在其回調事件中寫入處理代碼來處理 XML 文件,適合對 XML 的順序訪問;
● STAX:Streaming API for XML (StAX)。
1)在做數據交換平臺時,將不能數據源的數據組裝成 XML 文件,然后將 XML 文件壓縮打包加密后通過網絡傳送給接收者,接收解密與解壓縮后再同 XML 文件中還原相關信息進行處理。
2)在做軟件配置時,利用 XML 可以很方便的進行,軟件的各種配置參數都存貯在 XML 文件中。
JSON是一種取代XML的數據結構,和xml相比,它更小巧但描述能力不差,網絡傳輸數據將減少更多的流量從而加快速度,是一種輕量級的數據交換格式。
1.JSON是JavaScript Object Notation;XML是可擴展標記語言。
2.JSON是基于JavaScript語言;XML源自SGML。
3.JSON是一種表示對象的方式;XML是一種標記語言,使用標記結構來表示數據項。
4.JSON不提供對命名空間的任何支持;XML支持名稱空間。
5.JSON支持數組;XML不支持數組。
6.XML的文件相對難以閱讀和解釋;與XML相比,JSON的文件非常易于閱讀。
7.JSON不使用結束標記;XML有開始和結束標簽。
8.JSON的安全性較低;XML比JSON更安全。
9.JSON不支持注釋;XML支持注釋。
10.JSON僅支持UTF-8編碼;XML支持各種編碼。
HTTP是一個基于TCP/IP通信協議來傳遞數據,包括html文件、圖像、結果等,即是一個客戶端和服務器端請求和應答的標準?;旧嫌玫降木褪荊ET和POST,充其量再遇到個option請求。
(1)https有ca證書,http一般沒有;
(2)http是超文本傳輸協議,信息是明文傳輸。https則是具有安全性的ssl加密傳輸協;
(3)http默認80端口,https默認443端口。
(1)http無連接:限制每次連接只處理一個請求,服務端完成客戶端的請求后,即斷開連接。(傳輸速度快,減少不必要的連接,但也意味著每一次訪問都要建立一次連接,效率降低);
(2)http無狀態:對于事務處理沒有記憶能力。每一次請求都是獨立的,不記錄客戶端任何行為;
(3)客戶端/服務端模型:客戶端支持web瀏覽器或其他任何客戶端;
(4)簡單快速\靈活:可以傳輸任何類型的數據。
無狀態協議對于事務處理沒有記憶能力。缺少狀態意味著如果后續處理需要前面的信息。
狀態協議解決辦法:1、cookie 2、通過session會話保存。
http協議中,返回狀態碼302表示重定向。這種情況下,服務器返回的頭部信息中會包含一個Location字段,內容是重定向到的url。
請求報文包含三部分:請求行:包含請求方法、URI、HTTP版本信息;請求首部字段;請求內容實體。
響應報文包含三部分:狀態行:包含HTTP版本、狀態碼、狀態碼的原因短語;響應首部字段;響應內容實體。
GET:用于請求訪問已經被URI(統一資源標識符)識別的資源,可以通過URL傳參給服務器。
POST:用于傳輸信息給服務器,主要功能與GET方法類似,但一般推薦使用POST方式。
PUT: 傳輸文件,報文主體中包含文件內容,保存到對應URI位置。
HEAD: 獲得報文首部,與GET方法類似,只是不返回報文主體,一般用于驗證URI是否有效。
DELETE:刪除文件,與PUT方法相反,刪除對應URI位置的文件。
OPTIONS:查詢相應URI支持的HTTP方法。
TCP(Transmission Control Protocol,傳輸控制協議)是基于連接的協議,也就是說,在正式收發數據前,必須和對方建立可靠的連接。一個TCP連接必須要經過三次“對話”才能建立起來。
UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是面向非連接的協議,它不與對方建立連接,而是直接就把數據包發送過去,UDP適用于一次只傳送少量數據、對可靠性要求不高的應用環境。
HTTP協議有HTTP/1.0版本和HTTP/1.1版本。HTTP1.1默認保持長連接(HTTP persistent connection,也翻譯為持久連接),數據傳輸完成了保持TCP連接不斷開(不發RST包、不四次握手),等待在同域名下繼續用這個通道傳輸數據;相反的就是短連接。
在 HTTP/1.0 中,默認使用的是短連接。也就是說,瀏覽器和服務器每進行一次HTTP操作,就建立一次連接,任務結束就中斷連接。從HTTP/1.1起,默認使用的是長連接,用以保持連接特性。
CSRF(Cross-site request forgery)也被稱為 one-click attack或者 session riding,中文全稱是叫跨站請求偽造。一般來說,攻擊者通過偽造用戶的瀏覽器的請求,向訪問一個用戶自己曾經認證訪問過的網站發送出去,使目標網站接收并誤以為是用戶的真實操作而去執行命令。常用于盜取賬號、轉賬、發送虛假消息等。攻擊者利用網站對請求的驗證漏洞而實現這樣的攻擊行為,網站能夠確認請求來源于用戶的瀏覽器,卻不能驗證請求是否源于用戶的真實意愿下的操作行為。
XSS攻擊又稱CSS,全稱Cross Site Script (跨站腳本攻擊),其原理是攻擊者向有XSS漏洞的網站中輸入惡意的 HTML 代碼,當用戶瀏覽該網站時,這段 HTML 代碼會自動執行,從而達到攻擊的目的。XSS 攻擊類似于 SQL 注入攻擊,SQL注入攻擊中以SQL語句作為用戶輸入,從而達到查詢/修改/刪除數據的目的,而在xss攻擊中,通過插入惡意腳本,實現對用戶游覽器的控制,獲取用戶的一些信息。 XSS是 Web 程序中常見的漏洞,XSS 屬于被動式且用于客戶端的攻擊方式。
XSS防范的總體思路是:對輸入(和URL參數)進行過濾,對輸出進行編碼。
網絡的七層架構從下到上主要包括物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。
①物理層:物理層主要定義物理設備標準,主要作用是傳輸比特流,具體做法是在發送端將1、0轉化為電流強弱來進行傳輸,在到達目的地之后再將電流強弱轉化為1、0,也就是我們常說的模數轉換與數模轉換,這一層的數據叫做比特。
②數據鏈路層:數據鏈路層主要用于對數據包中的MAC地址進行解析和封裝。這一層的數據叫做幀,在這一層工作的設備是網卡、網橋、交換機。
③網絡層:網絡層主要用于對數據包中的IP地址進行封裝和解析,這一層的數據叫做數據包。在這一層工作的設備有路由器、交換機、防火墻等。
④傳輸層:傳輸層定義了傳輸數據的協議和端口號,主要用于數據的分段、傳輸和重組。在這一層工作的協議有TCP和UDP等。TCP是傳輸控制協議,傳輸效率低,可靠性強,用于傳輸對可靠性要求高,數據量大的數據,比如支付寶轉賬業務;UDP是用戶數據報協議,用于傳輸可靠性要求不高,數據量小的數據,例如抖音等視頻服務。
⑤會話層:會話層在傳輸層的基礎上建立連接和管理會話,具體包括登陸驗證、斷點續傳、數據粘包與分包等。在設備之間需要互相識別的可以是IP,也可以是MAC或者主機名。
⑥表示層:表示層主要對接收的數據進行解釋、加密、解密、壓縮、解壓縮等,即把計算機能夠識別的內容轉換成人能夠識別的內容(圖片、聲音、文字等)。
⑦應用層:基于網絡構建具體應用,例如FTP上傳文件下載服務、Telnet服務、HTTP服務、DNS服務、SNMP郵件服務等。
TCP/IP不是指TCP和IP這兩個協議的合稱,而是指因特網的整個TCP/IP協議簇。從協議分層模型方面來講,TCP/IP由4個層次組成:網絡接口層、網絡層、傳輸層和應用層。
①網絡接口層:定義了主機間網絡連通的協議,具體包括Echernet、FDDI、ATM等通信協議。
②網絡層:主要用于數據的傳輸、路由及地址的解析,以保障主機可以把數據發送給任何網絡上的目標。數據經過網絡傳輸,發送的順序和到達的順序可能發生變化。在網絡層使用IP協議和ARP地址解析協議。
③傳輸層:使源端和目的端的機器上的對等實體可以基于會話相互通信。在這一層定義了兩個端到端的協議TCP和UDP。TCP是面向連接的協議,提供可靠的報文傳輸和對上層應用的連接服務,除了基本的數據傳輸,它還有可靠性保證、流量控制、多路復用、優先權和安全性控制等功能。UDP是面向無連接的不可靠傳輸的協議,主要用于不需要TCP的排序和流量控制等功能的應用程序。
④應用層:負責具體應用層協議的定義,包括Telnet虛擬終端協議、FTP文件傳輸協議、SMTP簡單電子郵件傳輸協議、DNS域名解析服務、NNTP網上新聞傳輸協議和HTTP超文本傳輸協議等。
①服務端創建傳輸控制塊TCB,進入LISTEN狀態,準備接收客戶端的請求??蛻舳送瑯酉葎摻═CB,然后當準備建立連接時向服務端發送連接請求報文(SYN=1,seq=x),然后進入SYN-SENT狀態。
②服務端收到后向客戶端發送確認報文(SYN=1,ACK=1,ack=x+1,seq=y),進入SYN-RCVD狀態。
③客戶端接收到確認后,再向服務端發送一個確認報文(ACK=1,ack=y+1,seq=x+1),然后進入ESTABLISHED狀態,服務端接收后也進入ESTABLISHED狀態。
④不是兩次的原因是為了避免無效的連接請求突然發送到服務端,而此時客戶端已關閉,服務端誤以為客戶端將要發送數據會白白浪費資源。
⑤不是四次的原因是將服務端的SYN和ACK報文拆分成兩次發送和一次的效果是相同的,沒有意義。
①當客戶端準備關閉連接時,向服務端發送連接終止報文(FIN=1,seq=u),進入FIN-WAIT-1狀態。
②服務端接收后向客戶端發送確認報文(ACK=1,ack=u+1,seq=v),進入CLOSE-WAIT狀態,客戶端收到后進入FIN-WAIT-2狀態,此時TCP連接處于半關閉狀態。
③當服務端也發送完全部數據準備斷開連接時,向客戶發送連接終止報文(FIN=1,ACK=1,ack=u+1,seq=w),進入LAST-ACK狀態。
④客戶端接收到該報文后,發送一個確認報文(ACK=w+1,ack=1,seq=u+1),進入TIME-WAIT狀態,然后等待2MSL時間后關閉。服務端收到后關閉,時間將略早于客戶端。
⑤不是三次的原因第一是為了保證客戶端發送的最后一個報文可以到達服務端,如果該報文丟失那么服務端會超時重傳之前的FIN+ACK報文,客戶端可以在2MSL內收到,第二是防止已失效的報文發送到客戶端,在2MSL后客戶端在本連接時間內發出的所有報文都將從網絡中消失。
會話:客戶端打開與服務器的連接發出請求到服務器響應客戶端請求的全過程稱之為會話。
http協議是“無狀態”協議,不能保存用戶信息,需要判斷是否是同一個用戶,需要會話跟蹤。cookies和session都是用來跟蹤瀏覽器用戶身份的會話方式,但兩者應用場景不一樣。
Cookie 是Web 服務器發送給客戶端(瀏覽器)的一小段信息,客戶端請求時可以讀取該信息發送到服務器端,進而進行用戶的識別。對于客戶端的每次請求,服務器都會將 Cookie 發送到客戶端,在客戶端可以進行保存,以便下次使用。
Session 代表著服務器和客戶端一次會話的過程。每一個用戶都有一個不同的 session,各個用戶之間是不能共享的,是每個用戶所獨享的,在 session 中可以存放信息。Session 的實現依賴于 Cookie,如果 Cookie 被禁用,那么 session 也將失效。
(1)瀏覽器端第一次發送請求到服務器端
(2)服務器端創建Cookie,該Cookie中包含用戶的信息,然后將該Cookie發送到瀏覽器端
(3)瀏覽器端再次訪問服務器端時會攜帶服務器端創建的Cookie
(4)服務器端通過Cookie中攜帶的數據區分不同的用戶
(1)瀏覽器端第一次發送請求到服務器端,服務器端創建一個Session,同時會創建一個特殊的Cookie(name為JSESSIONID的固定值,value為session對象的ID),然后將該Cookie發送至瀏覽器端
(2)瀏覽器端發送第N(N>1)次請求到服務器端,瀏覽器端訪問服務器端時就會攜帶該name為JSESSIONID的Cookie對象
(3)服務器端根據name為JSESSIONID的Cookie的value(sessionId),去查詢Session對象,從而區分不同用戶。
第一種,在每次請求中都攜帶一個 SessionID 的參數放入URL
第二種,Token 機制。Token 的意思是“令牌”,是服務端生成的一串字符串,作為客戶端進行請求的一個標識。隨機且無狀態,用戶信息都被加密到token中,服務器收到token后解密就可知道是哪個用戶。需要開發者手動添加。
Cookie在生成時就會被指定一個Expire值,這就是Cookie的生存周期,在這個周期內Cookie有效,超出周期Cookie就會被清除。有些頁面將Cookie的生存周期設置為“0”或負值,這樣在關閉瀏覽器時,就馬上清除Cookie,不會記錄用戶信息,更加安全。
①存在的位置:
Cookie存在于客戶端,臨時文件夾中; Session存在于服務器的內存中,一個Session域對象為一個用戶瀏覽器服務
②安全性
Cookie是以明文的方式存放在客戶端的,安全性低,可以通過一個加密算法進行加密后存放; Session存放于服務器的內存中,所以安全性好
③網絡傳輸量
Cookie會傳遞消息給服務器; Session本身存放于服務器,不會有傳送流量
④生命周期(以20分鐘為例)
Cookie的生命周期是累計的,從創建時,就開始計時,20分鐘后,Cookie生命周期結束;
session的生命周期是間隔的,從創建時,開始計時如在20分鐘,沒有訪問Session,那么Session生命周期被銷毀。但是,如果在20分鐘內(如在第19分鐘時)訪問過Session,那么,將重新計算Session的生命周期。關機會造成Session生命周期的結束,但是對Cookie沒有影響
⑤訪問范圍
Cookie為多個用戶瀏覽器共享; Session為一個用戶瀏覽器獨享