JavaWeb之Servlet

Servlet:
Sun公司制訂的一種用來(lái)擴(kuò)展Web服務(wù)器功能的組件規(guī)范泡孩。當(dāng)瀏覽器將請(qǐng)求發(fā)送給Web服務(wù)器(比如:apcahe的web server)种柑,Web服務(wù)器會(huì)向Servlet容器發(fā)送請(qǐng)求窒典,Servlet容器負(fù)責(zé)解析請(qǐng)求數(shù)據(jù)包倍靡。
—> 組件:是符合一定規(guī)范叮盘,并且實(shí)現(xiàn)部分功能的可以單獨(dú)部署的軟件模塊。組建必須要部署到容器里面才能運(yùn)行灰殴。
—> 容器:也是符合一定規(guī)范敬特,并且提供組件的運(yùn)行環(huán)境的程序。

Tomcat:Tomcat本身是一個(gè)Servlet容器牺陶,即可以提供Servlet運(yùn)行環(huán)境的一個(gè)程序伟阔,但是Tomcat還提供了Web服務(wù)器所具有的所有功能,所以我們也稱Tomcat是一個(gè)Web服務(wù)器掰伸。Tomcat的默認(rèn)端口是8080皱炉。
—> 目錄結(jié)構(gòu):
①bin目錄:存放啟動(dòng)和關(guān)閉服務(wù)器的一些腳本(命令)。
②common目錄:共享(部署在該服務(wù)器上的所有程序都可以使用)的一些jar包狮鸭。
③conf目錄:存放服務(wù)器的一些配置文件合搅。
④webapps目錄:部署目錄。
⑤work目錄:服務(wù)器運(yùn)行時(shí)怕篷,生成的一些臨時(shí)文件历筝。

Http:(Hypertext transport protocol)是超文本傳輸協(xié)議。是一種應(yīng)用層協(xié)議廊谓,由W3C制定,它定義了瀏覽器(或者其他客戶端)與Web服務(wù)器之間通訊的過(guò)程及數(shù)據(jù)格式麻削。
—> 通信步驟:
①:瀏覽器建立與Web服務(wù)器之間的連接(Socket)蒸痹。
②:瀏覽器要將請(qǐng)求數(shù)據(jù)打包(請(qǐng)求數(shù)據(jù)包)春弥,然后發(fā)送給Web服務(wù)器。
③:Web服務(wù)器將處理結(jié)果打包(響應(yīng)數(shù)據(jù)包)叠荠,然后發(fā)送給瀏覽器匿沛。
④:Web服務(wù)器關(guān)閉連接。
◆ 特點(diǎn):一次請(qǐng)求榛鼎,一次連接逃呼。優(yōu)點(diǎn):Web服務(wù)器可以利用有限的連接個(gè)數(shù)為盡可能多的客戶服務(wù)(效率高)。如果瀏覽器要再發(fā)請(qǐng)求者娱,就必須重新建立一個(gè)新的連接抡笼。

Https:(Hyper Text Transfer Protocol over Secure Socket Layer)是為安全為目標(biāo)的HTTP通道,即HTTP下加入SSL層黄鳍。
—> 與HTTP區(qū)別
①:https地協(xié)議需要到ca申請(qǐng)證書(https://www.[shuzizhengshu.com/)推姻;
②:http的信息是明文傳輸,https則具有安全性的ssl加密傳輸協(xié)議框沟;
③:兩者使用的是完全不同的連接方式藏古,端口也不一樣,http是80忍燥,https是443拧晕;
④:http是無(wú)狀態(tài)的;https是由ssl+http協(xié)議構(gòu)建的可加密傳輸梅垄、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議防症。

信任主機(jī):采用https的服務(wù)器必須從CA (Certificate Authority)申請(qǐng)一個(gè)用于證明服務(wù)器用途類型的證書。該證書只有用于對(duì)應(yīng)的服務(wù)器的時(shí)候哎甲,客戶端才信任此主機(jī)蔫敲。
—>兩種信任主機(jī)方式:
1)一般意義上的https,就是服務(wù)器有一個(gè)證書;
服務(wù)器端和客戶端之間所有通訊都是加密的炭玫;
a. 客戶端產(chǎn)生一個(gè)對(duì)稱的密鑰奈嘿,通過(guò)服務(wù)器的證書來(lái)交換密鑰,即一般意義上的握手過(guò)程吞加;
b.接下來(lái)所有信息都是加密的裙犹。第三方即使截獲,也沒(méi)有任何意義衔憨,因?yàn)樗麤](méi)有密鑰叶圃,當(dāng)然篡改也就沒(méi)有什么意義了。
2)少許對(duì)客戶端有要求的情況下践图,會(huì)要求客戶端也必須有一個(gè)證書掺冠。
這里客戶端證書,其實(shí)就類似表示個(gè)人信息的時(shí)候码党,除了用戶名/密碼德崭,還有一個(gè)CA 認(rèn)證過(guò)的身份斥黑。(大多數(shù)個(gè)人銀行的專業(yè)版是這種做法,具體證書可能是拿U盤(即U盾)作為一個(gè)備份的載體眉厨。)

ssl協(xié)議工作流程:
①:客戶端向服務(wù)器發(fā)送一個(gè)開始信息“Hello”以便開始一個(gè)新的會(huì)話連接锌奴;

②:服務(wù)器根據(jù)客戶的信息確定是否需要生成新的主密鑰,如需要?jiǎng)t服務(wù)器在響應(yīng)客戶的“Hello”信息時(shí)將包含生成主密鑰所需的信息憾股;

③:客戶根據(jù)收到的服務(wù)器響應(yīng)信息鹿蜀,產(chǎn)生一個(gè)主密鑰,并用服務(wù)器的公開密鑰加密后傳給服務(wù)器服球;
④:服務(wù)器恢復(fù)該主密鑰茴恰,并返回給客戶一個(gè)用主密鑰認(rèn)證的信息,以此讓客戶認(rèn)證服務(wù)器有咨。

ssl握手過(guò)程:
①客戶端的瀏覽器向服務(wù)器傳送客戶端SSL 協(xié)議的版本號(hào)琐簇,加密算法的種類,產(chǎn)生的隨機(jī)數(shù)座享,以及其他服務(wù)器和客戶端之間通訊所需要的各種信息婉商。

②服務(wù)器向客戶端傳送SSL 協(xié)議的版本號(hào),加密算法的種類渣叛,隨機(jī)數(shù)以及其他相關(guān)信息丈秩,同時(shí)服務(wù)器還將向客戶端傳送自己的證書。

③客戶利用服務(wù)器傳過(guò)來(lái)的信息驗(yàn)證服務(wù)器的合法性淳衙,服務(wù)器的合法性包括:證書是否過(guò)期蘑秽,發(fā)行服務(wù)器證書的CA 是否可靠,發(fā)行者證書的公鑰能否正確解開服務(wù)器證書的“發(fā)行者的數(shù)字簽名”箫攀,服務(wù)器證書上的域名是否和服務(wù)器的實(shí)際域名相匹配肠牲。如果合法性驗(yàn)證沒(méi)有通過(guò),通訊將斷開靴跛;如果合法性驗(yàn)證通過(guò)缀雳,將繼續(xù)進(jìn)行第四步。

④用戶端隨機(jī)產(chǎn)生一個(gè)用于后面通訊的“對(duì)稱密碼”梢睛,然后用服務(wù)器的公鑰(服務(wù)器的公鑰從步驟②中的服務(wù)器的證書中獲得)對(duì)其加密肥印,然后將加密后的“預(yù)主密碼”傳給服務(wù)器。
⑤如果服務(wù)器要求客戶的身份認(rèn)證(在握手過(guò)程中為可選)绝葡,用戶可以建立一個(gè)隨機(jī)數(shù)然后對(duì)其進(jìn)行數(shù)據(jù)簽名深碱,將這個(gè)含有簽名的隨機(jī)數(shù)和客戶自己的證書以及加密過(guò)的“預(yù)主密碼”一起傳給服務(wù)器。

⑥如果服務(wù)器要求客戶的身份認(rèn)證藏畅,服務(wù)器必須檢驗(yàn)客戶證書和簽名隨機(jī)數(shù)的合法性敷硅,具體的合法性驗(yàn)證過(guò)程包括:客戶的證書使用日期是否有效,為客戶提供證書的CA 是否可靠,發(fā)行CA 的公鑰能否正確解開客戶證書的發(fā)行CA 的數(shù)字簽名竞膳,檢查客戶的證書是否在證書廢止列表(CRL)中航瞭。檢驗(yàn)如果沒(méi)有通過(guò)诫硕,通訊立刻中斷坦辟;如果驗(yàn)證通過(guò),服務(wù)器將用自己的私鑰解開加密的“預(yù)主密碼”章办,然后執(zhí)行一系列步驟來(lái)產(chǎn)生主通訊密碼(客戶端也將通過(guò)同樣的方法產(chǎn)生相同的主通訊密碼)锉走。

⑦服務(wù)器和客戶端用相同的主密碼即“通話密碼”,一個(gè)對(duì)稱密鑰用于SSL 協(xié)議的安全數(shù)據(jù)通訊的加解密通訊藕届。同時(shí)在SSL 通訊過(guò)程中還要完成數(shù)據(jù)通訊的完整性挪蹭,防止數(shù)據(jù)通訊中的任何變化。

⑧客戶端向服務(wù)器端發(fā)出信息休偶,指明后面的數(shù)據(jù)通訊將使用的步驟⑦中的主密碼為對(duì)稱密鑰梁厉,同時(shí)通知服務(wù)器客戶端的握手過(guò)程結(jié)束。

⑨服務(wù)器向客戶端發(fā)出信息踏兜,指明后面的數(shù)據(jù)通訊將使用的步驟⑦中的主密碼為對(duì)稱密鑰词顾,同時(shí)通知客戶端服務(wù)器端的握手過(guò)程結(jié)束。

⑩SSL 的握手部分結(jié)束碱妆,SSL 安全通道的數(shù)據(jù)通訊開始肉盹,客戶和服務(wù)器開始使用相同的對(duì)稱密鑰進(jìn)行數(shù)據(jù)通訊,同時(shí)進(jìn)行通訊完整性的檢驗(yàn)疹尾。

—> 數(shù)據(jù)格式:
1)請(qǐng)求數(shù)據(jù)包:
①請(qǐng)求行:請(qǐng)求方式+請(qǐng)求資源路徑+協(xié)議描述上忍。
②若干消息頭:消息頭是一些鍵值對(duì),一般由W3C定義纳本,有特定的含義窍蓝。
③實(shí)體內(nèi)容:只有當(dāng)請(qǐng)求方式為post時(shí),瀏覽器才會(huì)將請(qǐng)求參數(shù)添加到實(shí)體內(nèi)容里面繁成,如果請(qǐng)求方式為get吓笙,瀏覽器會(huì)將請(qǐng)求參數(shù)添加到請(qǐng)求資源路徑的后面。
2)響應(yīng)數(shù)據(jù)包
①狀態(tài)行:協(xié)議描述+狀態(tài)碼+狀態(tài)描述朴艰。
②若干消息頭:服務(wù)器也可以發(fā)送一些消息頭給瀏覽器
③實(shí)體內(nèi)容:程序處理之后观蓄,返回的結(jié)果。
3)get/post:
①get請(qǐng)求會(huì)將請(qǐng)求參數(shù)添加到請(qǐng)求資源路徑的后面祠墅,因?yàn)檎?qǐng)求行存放的數(shù)據(jù)大小有限(也就是地址欄的最長(zhǎng)字節(jié)數(shù))侮穿,所以get請(qǐng)求只能提交少量的數(shù)據(jù)。
②get請(qǐng)求會(huì)將請(qǐng)求參數(shù)顯示在瀏覽器地址欄毁嗦,不安全(比如亲茅,路由器會(huì)記錄整個(gè)地址)
③ post請(qǐng)求會(huì)將請(qǐng)求參數(shù)添加到實(shí)體內(nèi)容里面,所以,可以提交大量的數(shù)據(jù)克锣。
④ post請(qǐng)求不會(huì)將請(qǐng)求參數(shù)顯示在瀏覽器地址欄茵肃,相對(duì)安全一些。但是袭祟,post請(qǐng)求并不會(huì)對(duì)請(qǐng)求參數(shù)進(jìn)行加密處理验残。用HTTPS協(xié)議進(jìn)行加密處理

重定向:服務(wù)器發(fā)送一個(gè)302狀態(tài)碼及一個(gè)Location消息頭(值是一個(gè)地址,稱為重定向地址)巾乳,通知瀏覽器立即向重定向地址發(fā)請(qǐng)求您没。[ response.sendRedirect(String url) ]
—> 特點(diǎn):
1)重定向的地址是任意的(前提要存在否則報(bào)404)。
2)重定向之后胆绊,瀏覽器地址欄的地址會(huì)變成重定向地址氨鹏。

請(qǐng)求轉(zhuǎn)發(fā):一個(gè)Web組件(Servlet/JSP)將未完成的處理通過(guò)容器轉(zhuǎn)交給另外一個(gè)Web組件繼續(xù)完成零蓉。常見的情況是:一個(gè)Servlet將數(shù)據(jù)處理完畢之后艘绍,轉(zhuǎn)交給一個(gè)JSP去展現(xiàn)。
—>步驟:
1)綁定數(shù)據(jù)到request:request里有個(gè)HashMap密浑。request.setAttribute(String name,Object obj);
2)獲得一個(gè)轉(zhuǎn)發(fā)器:url:要轉(zhuǎn)發(fā)給哪一個(gè)Web組件种冬。RequestDispatcher rd=request.getRequsetDispatcher(String url);
3)轉(zhuǎn)發(fā): rd.forward(request,response);//JSP和Servlet會(huì)共享相同的請(qǐng)求和響應(yīng)對(duì)象
4)在轉(zhuǎn)發(fā)的目的地镣丑,可以使用request.getAttribute方法獲得綁定的數(shù)據(jù),然后進(jìn)行處理碌廓〈洌【注意:轉(zhuǎn)發(fā)之前,先清空response對(duì)象中緩存的數(shù)據(jù)谷婆;不能調(diào)用out.close()或著out.flush只能同時(shí)處理一個(gè)響應(yīng)】
—> 特點(diǎn):
1)轉(zhuǎn)發(fā)的目的地只能夠是同一個(gè)應(yīng)用內(nèi)部的某個(gè)組件的地址慨蛙。
2)轉(zhuǎn)發(fā)之后,瀏覽器地址欄的地址不變纪挎。
3)轉(zhuǎn)發(fā)所涉及的各個(gè)Web組件可以共享同一個(gè)request對(duì)象和response對(duì)象

轉(zhuǎn)發(fā)和重定向的區(qū)別:
1)轉(zhuǎn)發(fā)的目的地只能是同一個(gè)應(yīng)用內(nèi)部某個(gè)組件的地址期贫,而重定向的目的地是任意的。
2)轉(zhuǎn)發(fā)之后异袄,瀏覽器地址欄的地址不變通砍,而重定向會(huì)變。
3)轉(zhuǎn)發(fā)所涉及的各個(gè)Web組件可以共享request對(duì)象烤蜕,而重定向不可以封孙。
4)轉(zhuǎn)發(fā)是一件事情未做完,而重定向是一件事情已經(jīng)做完讽营。

Servlet容器資源路徑處理
1)Servlet容器會(huì)先假設(shè)訪問(wèn)的是一個(gè)Servlet虎忌,會(huì)依據(jù)應(yīng)用名(appname)找到應(yīng)用所在的文件夾,然后找到web.xml文件橱鹏。
2)匹配<url-pattern>
①精確匹配(完全匹配):“/”膜蠢、大小寫堪藐、名字完全一樣。
②通配符匹配:使用 “” 來(lái)匹配任意長(zhǎng)度的字符串挑围,比如:<url-pattern>/</url-pattern>
③后綴匹配:使用“.”開頭礁竞,后接任意的字符串,比如:<url-pattern>.do</url-pattern>
3)如果都不匹配杉辙,則容器認(rèn)為訪問(wèn)的是一個(gè)靜態(tài)資源文件(比如html文件)模捂,然后容器會(huì)查找該文件,如果找到則返回奏瞬,否則會(huì)返回404

Servlet處理多種請(qǐng)求
1)使用后綴匹配模式枫绅,比如<url-pattern>*.do</url-pattern>
2)分析請(qǐng)求資源路徑泉孩,然后依據(jù)分析的結(jié)果分別進(jìn)行不同的處理硼端,需使用String request.getRequestURI();

Servlet生命周期:四個(gè)階段:
1)實(shí)例化:指的是容器調(diào)用Servlet的構(gòu)造器,創(chuàng)建Servlet對(duì)象寓搬。
—> 時(shí)機(jī):
情況1:容器收到請(qǐng)求之后才創(chuàng)建Servlet對(duì)象珍昨。在默認(rèn)情況下,容器只會(huì)為Servlet創(chuàng)建唯一的一個(gè)實(shí)例(多線程句喷,有安全問(wèn)題镣典。每次請(qǐng)求創(chuàng)建一個(gè)線程,由線程去調(diào)用方法)唾琼。
情況2:容器事先(容器啟動(dòng)時(shí))將某些Servlet(需要配置load-on-startup參數(shù))對(duì)象創(chuàng)建好兄春。load-on-startup參數(shù)值必須是>=0的整數(shù),越小锡溯,優(yōu)先級(jí)越高(即先被實(shí)例化)赶舆。參數(shù)加在web.xml配置文件里的某個(gè)<servlet>標(biāo)簽里,如<load-on-startup>1</load-on-startup>
2)初始化:指的是容器在創(chuàng)建好Servlet對(duì)象之后祭饭,會(huì)立即調(diào)用Servlet對(duì)象的init方法芜茵。
3)就緒:指是Servlet對(duì)象可以接受調(diào)用了,容器收到請(qǐng)求之后倡蝙,會(huì)調(diào)用Servlet對(duì)象的service方法來(lái)處理九串,且可以被執(zhí)行多次。
4)銷毀:銷毀指的是Servlet容器在銷毀Servlet對(duì)象之前寺鸥,會(huì)調(diào)用destroy方法猪钮,且只會(huì)執(zhí)行一次。

狀態(tài)管理:將瀏覽器與Web服務(wù)器之間多次交互當(dāng)作一個(gè)整體來(lái)看待胆建,并且將多次交互所涉及的數(shù)據(jù)保存下來(lái)烤低。
—> 類型:
1)客戶端狀態(tài)管理技術(shù),即將狀態(tài)(也就是多次交互所涉及的數(shù)據(jù))保存在客戶端(瀏覽器)眼坏。
2)服務(wù)器端狀態(tài)管理技術(shù)拂玻,即將狀態(tài)保存在Web服務(wù)器端酸些。

cookie:
①是一種客戶端的狀態(tài)管理技術(shù)。
②當(dāng)瀏覽器訪問(wèn)服務(wù)器的時(shí)候檐蚜,服務(wù)器可以將少量的數(shù)據(jù)以set-cookie消息頭的方式發(fā)送給瀏覽器魄懂,瀏覽器會(huì)將這些數(shù)據(jù)保存下來(lái)。當(dāng)瀏覽器再次訪問(wèn)服務(wù)器時(shí)闯第,會(huì)將之前保存的這些數(shù)據(jù)以cookie消息頭的方式發(fā)送給服務(wù)器市栗。
【注意:有幾個(gè)cookie,就有幾個(gè)set-cookie消息頭咳短√蠲保】
1)創(chuàng)建:Cookie c=new Cookie(String name,String value);//name:cookie的名稱。value:cookie的值
2)添加Cookie:response.addCookie(c);//調(diào)用響應(yīng)對(duì)象的addCookie方法
3)查詢Cookie:Cookie[] request.getCookies();//如果沒(méi)有任何的cookie咙好,則返回null篡腌; String cookie.getName();//返回cookie的名稱; String cookie.getValue();//返回cookie的值勾效;
4)編碼:cookie的值或者名稱只允許合法的ASCII碼字符串嘹悼,如果是中文,需要將中文轉(zhuǎn)換成ASCII碼字符串层宫。
String URLEncoder.encode(String str,String code);
String URLDecoder.decode(String str,String code);
5)Cookie生存時(shí)間:默認(rèn)情況下杨伙,瀏覽器會(huì)將cookie保存在內(nèi)存里,只要瀏覽器不關(guān)閉萌腿,cookie會(huì)一直存在限匣。
—> 啟動(dòng)FireFox后,操作系統(tǒng)會(huì)為瀏覽器開辟一塊內(nèi)存空間:
①瀏覽器(FireFox)訪問(wèn)服務(wù)器毁菱。
②服務(wù)器生成消息頭setCookie發(fā)回給瀏覽器米死。
③瀏覽器將服務(wù)器生成的消息頭保存到內(nèi)存區(qū)域。
④當(dāng)瀏覽器關(guān)閉鼎俘,系統(tǒng)回收為瀏覽器分配的內(nèi)存哲身,cookie也相應(yīng)消失。
—> 設(shè)置生存時(shí)間:使用cookie.setMaxAge(int seconds)方法贸伐。
①單位是秒勘天。
②當(dāng)seconds>0時(shí),瀏覽器會(huì)將cookie保存在硬盤上捉邢,當(dāng)cookie保存的時(shí)間超過(guò)了seconds脯丝,則cookie會(huì)被瀏覽器刪除。
③當(dāng)seconds<0時(shí)伏伐,缺省值(瀏覽器會(huì)將cookie保存在內(nèi)存里)宠进。
④當(dāng)seconds=0時(shí),刪除cookie藐翎。所以Cookie中無(wú)刪除方法材蹬,設(shè)置為0即可实幕。而修改,則為覆蓋堤器,用相同的name昆庇。
6)Cookie路徑問(wèn)題:瀏覽器在向服務(wù)器上的某個(gè)地址發(fā)請(qǐng)求時(shí),會(huì)比較請(qǐng)求地址與cookie的路徑是否匹配闸溃,只有匹配的cookie才會(huì)發(fā)送整吆。
①默認(rèn)路徑:值等于創(chuàng)建該cookie的組件的路徑,比如:/web06_Cookie/
②匹配規(guī)則:只有當(dāng)訪問(wèn)的地址是cookie的路徑或著是其子路徑時(shí)辉川,瀏覽器才會(huì)將這個(gè)cookie進(jìn)行發(fā)送表蝙。
7)Cookie限制:
①cookie可以被用戶禁止。
②因?yàn)閏ookie保存在瀏覽器端乓旗,所以cookie不安全府蛇。對(duì)于一些敏感的數(shù)據(jù),需要加密處理寸齐。
③cookie只能夠保存少量的數(shù)據(jù)(大約是4K左右)欲诺。
④cookie的個(gè)數(shù)也有限制(瀏覽器只能夠保存大約300個(gè)左右的cookie,另外對(duì)于某個(gè)服務(wù)器也有cookie個(gè)數(shù)的限制渺鹦,大約是20個(gè))。
⑤cookie只能夠保存字符串蛹含,對(duì)象毅厚、集合、數(shù)組都不能保存浦箱。

session(會(huì)話):
①是服務(wù)器端的狀態(tài)管理技術(shù)吸耿。
②當(dāng)瀏覽器訪問(wèn)服務(wù)器時(shí),服務(wù)器會(huì)創(chuàng)建一個(gè)session對(duì)象(該對(duì)象有一個(gè)唯一的id號(hào)酷窥,稱之為sessionId)咽安。接下來(lái),服務(wù)器在默認(rèn)情況下蓬推,會(huì)使用set-cookie消息頭將這個(gè)sessionId發(fā)送瀏覽器妆棒,瀏覽器會(huì)將這個(gè)sessionId保存下來(lái)(內(nèi)存中,因?yàn)橹付ㄉ鏁r(shí)間)沸伏。當(dāng)瀏覽器再次訪問(wèn)服務(wù)器時(shí)糕珊,會(huì)將sessionId使用cookie消息頭發(fā)送給服務(wù)器,服務(wù)器依據(jù)這個(gè)sessionId就可以找到之前創(chuàng)建的session對(duì)象毅糟。
③用戶與服務(wù)器之間的多次交互叫一次會(huì)話红选。

  1. 創(chuàng)建:
    —> 方式一:HttpSession s=request.getSession(boolean flag);//HttpSession是一個(gè)接口,返回一個(gè)符合要求的對(duì)象(工廠)
    【注意:當(dāng)flag=true時(shí):
    服務(wù)器會(huì)先檢查請(qǐng)求當(dāng)中是否有sessionId姆另,如果沒(méi)有則創(chuàng)建一個(gè)session對(duì)象喇肋。如果有sessionId坟乾,則服務(wù)器會(huì)依據(jù)sessionId查找對(duì)應(yīng)的session對(duì)象,如果找到了蝶防,則返回session對(duì)象糊渊。根據(jù)sessionId找不到,則服務(wù)器會(huì)創(chuàng)建一個(gè)新的session對(duì)象慧脱。
    當(dāng)flag=false時(shí):服務(wù)器會(huì)先檢查請(qǐng)求當(dāng)中是否有sessionId渺绒,如果沒(méi)有則返回null。如果有sessionId菱鸥,則服務(wù)器會(huì)依據(jù)sessionId查找對(duì)應(yīng)的session對(duì)象宗兼,如果找到了,則返回session對(duì)象氮采。根據(jù)sessionId找不到殷绍,則服務(wù)器返回null∪的】
    —> 方式二:HttpSession s=request.getSession();//等價(jià)于HttpSession s=request.getSession(true);
  2. 常用方法:
    —> String getId():獲得sessionId
    —> setAttribute(String name,Object obj):綁定一個(gè)對(duì)象到session對(duì)象上
    —> getAttribute(String name):獲得綁定對(duì)象主到,如果不存在則返回null
    —> removeAttribute(String name):解除綁定(request也有)
  3. session超時(shí):
    ① 服務(wù)器會(huì)將空閑時(shí)間過(guò)長(zhǎng)的session對(duì)象刪除。大部分服務(wù)器默認(rèn)的session超時(shí)限制是30分鐘躯概。
    ② 修改超時(shí)限制:可以修改這個(gè)默認(rèn)的超時(shí)限制登钥。setMaxInactiveInterval(int seconds); 或者在web.xml中修改
<session-config>        <session-timeout>30</session-timeout>    </session-config>

③ 立即刪除session:invalidate();//實(shí)際是清空session對(duì)象的內(nèi)容,然后可以給其他人繼續(xù)使用該session對(duì)象

用戶禁止cookie后娶靡,如何繼續(xù)使用session:

  1. 如果用戶禁止cookie牧牢,服務(wù)器仍然會(huì)將sessionId以cookie的方式發(fā)送給瀏覽器,但是姿锭,瀏覽器不再保存這個(gè)cookie(即sessionId)
  2. 如果想要繼續(xù)使用session塔鳍,需要采取其他方式來(lái)實(shí)現(xiàn)sessionId的跟蹤,如可以使用url重寫來(lái)實(shí)現(xiàn)sessionId的跟蹤呻此。
    url重寫:瀏覽器在訪問(wèn)服務(wù)器上的某個(gè)地址時(shí)轮纫,不能夠直接寫這個(gè)組件(Servlet/JSP)的地址,而應(yīng)該使用服務(wù)器生成的包含有sessionId的地址焚鲜。
    ① response.encodeURL(String utl);//encodeURL方法用在鏈接地址掌唾、表單提交地址。
    ② response.encodeRedirectURL(String url);//用于重定向
    ③ 轉(zhuǎn)發(fā)不用考慮恃泪!是服務(wù)器內(nèi)部郑兴,不是瀏覽器訪問(wèn)服務(wù)器。

session的優(yōu)缺點(diǎn):
—> 優(yōu)點(diǎn):
1)session比較安全(相對(duì)于cookie)因?yàn)閷⑺袪顟B(tài)都寫在服務(wù)器端贝乎。
2)session能夠保存的數(shù)據(jù)類型更加豐富(cookie只能保存字符串)情连。
3)session能夠保存的數(shù)據(jù)大小更大(cookie只能保存大約4K左右的數(shù)據(jù)),理論上session是沒(méi)有限制的览效。
4)session沒(méi)有被禁止的問(wèn)題却舀,也就不需要url重寫(cookie可以被用戶禁止)虫几。
—> 缺點(diǎn):
1)session會(huì)將數(shù)據(jù)放在服務(wù)器端,所以挽拔,對(duì)服務(wù)器的資源的占用比較大辆脸,而cookie會(huì)將數(shù)據(jù)保存在瀏覽器端,對(duì)服務(wù)器資源的占用沒(méi)有螃诅。
2)session默認(rèn)情況下啡氢,會(huì)將sessionId以cookie的方式發(fā)送給瀏覽器,瀏覽器會(huì)將session保存到內(nèi)存中术裸,如果瀏覽器關(guān)閉倘是,瀏覽器發(fā)請(qǐng)求時(shí)就沒(méi)有sessionId,服務(wù)器端的session對(duì)象就找不到了袭艺。
【注意:可使用 spring session來(lái)管理 】

過(guò)濾器: Servlet規(guī)范當(dāng)中定義的一種特殊的組件搀崭,可以攔截Servlet容器的調(diào)用過(guò)程并進(jìn)行相應(yīng)的處理。某個(gè)過(guò)濾器只有一個(gè)實(shí)例猾编,即單例模式瘤睹。

監(jiān)聽器: Servlet規(guī)范當(dāng)中定義的一種特殊的組件,用來(lái)監(jiān)聽容器產(chǎn)生的事件并進(jìn)行處理答倡。
—> 容器產(chǎn)生的兩大類事件:
1)生命周期相關(guān)的事件:容器在創(chuàng)建或者銷毀Requset對(duì)象轰传、Session對(duì)象、ServletContext對(duì)象(Servlet上下文)時(shí)產(chǎn)生的事件苇羡。
2)綁定相關(guān)的事件:容器調(diào)用了 Request 對(duì)象绸吸、 Session 對(duì)象、 ServletContext 的 setAttribute 设江、 removeAttribute 時(shí)產(chǎn)生的事件。

**ServletContext **:容器在啟動(dòng)的時(shí)候攘轩,會(huì)為每一個(gè)應(yīng)用創(chuàng)建唯一的一個(gè)符合ServletContext接口要求的對(duì)象(Servlet上下文)叉存,該對(duì)象一直存在,只有非容器關(guān)閉時(shí)對(duì)象被銷毀度帮。
—> GenericServlet. getServletContext() ;//通過(guò)GenericServlet抽象類獲得上下文(其實(shí)也是調(diào)用了ServletConfig的getServletContext方法)
—> HttpSession. getServletContext();//通過(guò)Session獲得上下文
—> ServletConfig .getServletContext() ;//通過(guò)ServletConfig接口獲得上下文
—> FilterConfig .getServletContext() ;//通過(guò)過(guò)濾器獲得上下文
** 作用:
1)綁定數(shù)據(jù): setAttribute 歼捏、 removeAttribute 、 getAttribute 笨篷、 Request 瞳秽、 Session 、 ServletContext 都提供了綁定數(shù)據(jù)的相關(guān)的三個(gè)方法率翅,如果都滿足使用的條件练俐,應(yīng)該優(yōu)先使用生命周期短的 Request<Session<ServletContext )。

①Request對(duì)象上綁定的數(shù)據(jù)只有同一個(gè)請(qǐng)求所涉及的各個(gè)Web組件可以共享冕臭,例如:一個(gè)Servlet將數(shù)據(jù)綁定到Request腺晾,然后轉(zhuǎn)發(fā)到一個(gè)jsp燕锥。請(qǐng)求先交給過(guò)濾器來(lái)處理,然后調(diào)用Servlet悯蝉。
②Session對(duì)象上綁定的數(shù)據(jù)是用一個(gè)會(huì)話所涉及的各個(gè)Web組件可以共享归形。
③ServletContext對(duì)象綁定的數(shù)據(jù)是公開的,誰(shuí)都可以訪問(wèn)鼻由,而且隨時(shí)可訪問(wèn)

2)訪問(wèn)全局的初始化參數(shù):即使用<context-param>配置的初始化參數(shù)暇榴,調(diào)用 String getInitParameter(String paramName) 方法,可以被同一個(gè)應(yīng)用中的所有的Servlet蕉世、Filter共享蔼紧。
3)依據(jù)邏輯路徑(path)獲得實(shí)際部署時(shí)的物理路徑

**C/S架構(gòu): Client/Server **
1)兩層的C/S架構(gòu):
—> 優(yōu)點(diǎn):開發(fā)效率高;
—> 缺點(diǎn):
①對(duì)數(shù)據(jù)庫(kù)而言可移植性差讨彼。
②不適合大型應(yīng)用(服務(wù)器提供的連接個(gè)數(shù)是有限的)歉井。
2)三層的C/S架構(gòu):有自定義協(xié)議;TCP/IP協(xié)議有兩個(gè)問(wèn)題:①拆包問(wèn)題哈误。②粘包問(wèn)題哩至。
—> 執(zhí)行過(guò)程:用戶點(diǎn)擊GUI(圖形界面),GUI調(diào)用通信蜜自,通信打包(自定義協(xié)議)菩貌,發(fā)送請(qǐng)求給服務(wù)器通信,通信拆包(自定義協(xié)議)重荠,調(diào)用業(yè)務(wù)箭阶,業(yè)務(wù)處理,結(jié)果發(fā)給通信戈鲁,通信打包仇参,發(fā)送響應(yīng)給客戶端通信,通信拆包婆殿,然后更新GUI诈乒。

**B/S架構(gòu): Browser/Server **
和C/S三層架構(gòu)相同,只是客戶端不用寫婆芦,服務(wù)器不用寫怕磨,通信也不用寫,瀏覽器里都有消约,采用http協(xié)議肠鲫,是w3c標(biāo)準(zhǔn),不需要自定義協(xié)議了或粮。

博客地址:JavaWeb之Servlet

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末导饲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帜消,老刑警劉巖棠枉,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異泡挺,居然都是意外死亡辈讶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門娄猫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贱除,“玉大人,你說(shuō)我怎么就攤上這事媳溺≡禄希” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵悬蔽,是天一觀的道長(zhǎng)扯躺。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蝎困,這世上最難降的妖魔是什么录语? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮禾乘,結(jié)果婚禮上澎埠,老公的妹妹穿的比我還像新娘。我一直安慰自己始藕,他們只是感情好蒲稳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伍派,像睡著了一般江耀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诉植,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天决记,我揣著相機(jī)與錄音,去河邊找鬼倍踪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛索昂,可吹牛的內(nèi)容都是我干的建车。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼椒惨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缤至!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起康谆,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤领斥,失蹤者是張志新(化名)和其女友劉穎嫉到,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體月洛,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡何恶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嚼黔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片细层。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖唬涧,靈堂內(nèi)的尸體忽然破棺而出疫赎,到底是詐尸還是另有隱情,我是刑警寧澤碎节,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布捧搞,位于F島的核電站,受9級(jí)特大地震影響狮荔,放射性物質(zhì)發(fā)生泄漏胎撇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一轴合、第九天 我趴在偏房一處隱蔽的房頂上張望创坞。 院中可真熱鬧,春花似錦受葛、人聲如沸题涨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纲堵。三九已至,卻和暖如春闰渔,著一層夾襖步出監(jiān)牢的瞬間席函,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工冈涧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茂附,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓督弓,卻偏偏與公主長(zhǎng)得像营曼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子愚隧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容