Sevlet基礎(chǔ)
Servlet的方法
- 構(gòu)造方法: 創(chuàng)建servlet對(duì)象的時(shí)候調(diào)用福也。默認(rèn)情況下,第一次訪問servlet的時(shí)候創(chuàng)建servlet對(duì)象只調(diào)用1次沐鼠。證明servlet對(duì)象在tomcat是單實(shí)例的绳军。
- init方法: 創(chuàng)建完servlet對(duì)象的時(shí)候調(diào)用五督。只調(diào)用1次彰导。
- service方法: 每次發(fā)出請(qǐng)求時(shí)調(diào)用蛔翅。調(diào)用n次。
- destroy方法: 銷毀servlet對(duì)象的時(shí)候調(diào)用位谋。停止服務(wù)器或者重新部署web應(yīng)用時(shí)銷毀servlet對(duì)象山析。只調(diào)用1次。
Servlet的生命周期
- 通過映射找到到servlet-class的內(nèi)容倔幼,字符串:com.nightliar.a_servlet.FirstServlet盖腿;
- 通過反射構(gòu)造FirstServlet對(duì)象
- 得到字節(jié)碼對(duì)象:Class clazz = class.forName("com.nightliar.a_servlet.FirstServlet");
- 調(diào)用無(wú)參數(shù)的構(gòu)造方法來(lái)構(gòu)造對(duì)象:Object obj = clazz.newInstance();
- 創(chuàng)建ServletConfig對(duì)象,通過反射調(diào)用init方法
- 得到方法對(duì)象:Method m = clazz.getDeclareMethod("init",ServletConfig.class);
- 調(diào)用方法:m.invoke(obj,config);
- 創(chuàng)建request损同,response對(duì)象,通過反射調(diào)用service方法
- 得到方法對(duì)象:Methodm m
= clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class); - 調(diào)用方法:m.invoke(obj,request,response);
- 得到方法對(duì)象:Methodm m
- 當(dāng)tomcat服務(wù)器停止或web應(yīng)用重新部署鸟款,通過反射調(diào)用destroy方法
- 得到方法對(duì)象:Method m = clazz.getDeclareMethod("destroy",null);
- 調(diào)用方法:m.invoke(obj,null);
總結(jié)
servlet對(duì)象在tomcat服務(wù)器是單實(shí)例多線程的膏燃,所以當(dāng)多個(gè)servlet的線程同時(shí)訪問了servlet的共享數(shù)據(jù),如成員變量何什,可能會(huì)引發(fā)線程安全問題组哩。
Cookie基礎(chǔ)
Cookie是由服務(wù)器端生成,發(fā)送給User-Agent处渣,瀏覽器會(huì)將Cookie的key/value保存到某個(gè)目錄下的文本文件內(nèi)伶贰,下次請(qǐng)求同一網(wǎng)站時(shí)就發(fā)送該Cookie給服務(wù)器。
Cookie常用api
//1.構(gòu)造Cookie對(duì)象
Cookie(java.lang.String name, java.lang.String value)
//2.設(shè)置cookie
void setPath(java.lang.String uri); //設(shè)置cookie的有效訪問路徑
void setMaxAge(int expiry) : //設(shè)置cookie的有效時(shí)間
void setValue(java.lang.String newValue); //設(shè)置cookie的值
//3.發(fā)送cookie到瀏覽器端保存
void response.addCookie(Cookie cookie); //發(fā)送cookie
//4.服務(wù)器接收cookie
Cookie[] request.getCookies(); //接收cookie
Cookie工作原理
- 服務(wù)器創(chuàng)建cookie對(duì)象罐栈,把會(huì)話數(shù)據(jù)存儲(chǔ)到cookie對(duì)象中黍衙,調(diào)用new Cookie("name","value")方法;
- 服務(wù)器發(fā)送cookie信息到瀏覽器荠诬,調(diào)用response.addCookie(cookie)方法琅翻,例如:set-cookie: name = zhangsan (隱藏發(fā)送了一個(gè)set-cookie名稱的響應(yīng)頭);
- 瀏覽器得到服務(wù)器發(fā)送的cookie柑贞,然后保存在瀏覽器端方椎;
- 瀏覽器在下次訪問服務(wù)器時(shí),會(huì)帶著cookie信息钧嘶,例如: cookie: name = zhangsan (隱藏帶著一個(gè)叫cookie名稱的請(qǐng)求頭)棠众;
- 服務(wù)器接收到瀏覽器帶來(lái)的cookie信息,調(diào)用request.getCookies()有决。
Cookie的細(xì)節(jié)
- void setPath(java.lang.String uri):設(shè)置cookie的有效訪問路徑闸拿。有效路徑指的是cookie的有效路徑保存在哪里轿亮,那么瀏覽器在有效路徑下訪問服務(wù)器時(shí)就會(huì)帶著cookie信息,否則不帶cookie信息胸墙。
- void setMaxAge(int expiry):設(shè)置cookie的有效時(shí)間:
- 正整數(shù):表示cookie數(shù)據(jù)保存瀏覽器的緩存目錄(硬盤中)我注,數(shù)值表示保存的時(shí)間;
- 負(fù)整數(shù):表示cookie數(shù)據(jù)保存瀏覽器的內(nèi)存中迟隅。瀏覽器關(guān)閉cookie就丟失了但骨;
- 零:表示刪除同名的cookie數(shù)據(jù)。
- Cookie數(shù)據(jù)類型只能保存非中文字符串類型的智袭”疾可以保存多個(gè)cookie,但是瀏覽器一般只允許存放300個(gè)Cookie吼野,每個(gè)站點(diǎn)最多存放20個(gè)Cookie校哎,每個(gè)Cookie的大小限制為4KB。
Session基礎(chǔ)
Session是另一種記錄客戶狀態(tài)的機(jī)制瞳步,不同的是Cookie保存在客戶端瀏覽器中闷哆,而Session保存在服務(wù)器上〉テ穑客戶端瀏覽器訪問服務(wù)器的時(shí)候抱怔,服務(wù)器把客戶端信息以某種形式記錄在服務(wù)器上。這就是Session嘀倒∏簦客戶端瀏覽器再次訪問時(shí)只需要從該Session中查找該客戶的狀態(tài)就可以了。每個(gè)用戶訪問服務(wù)器都會(huì)建立一個(gè)session测蘑,那服務(wù)器是怎么標(biāo)識(shí)用戶的唯一身份呢灌危?事實(shí)上,用戶與服務(wù)器建立連接的同時(shí)碳胳,服務(wù)器會(huì)自動(dòng)為其分配一SessionId勇蝙。
Session常用api
//1.創(chuàng)建或得到session對(duì)象
HttpSession getSession()
HttpSession getSession(boolean create)
//2.設(shè)置session對(duì)象
void setMaxInactiveInterval(int interval); //設(shè)置session的有效時(shí)間
void invalidate(); //銷毀session對(duì)象
java.lang.String getId(); //得到sessionid
//3.保存會(huì)話數(shù)據(jù)到session對(duì)象
void setAttribute(java.lang.String name, java.lang.Object value); //保存數(shù)據(jù)
Object getAttribute(java.lang.String name); //獲取數(shù)據(jù)
void removeAttribute(java.lang.String name); //清除數(shù)據(jù)
//4.設(shè)置session的有效時(shí)間
void setMaxInactiveInterval(int interval);
Session工作原理
- 第一次訪問創(chuàng)建session對(duì)象固逗,給session對(duì)象分配一個(gè)唯一的ID浅蚪,叫JSESSIONID;
new HttpSession();
- 把JSESSIONID作為Cookie的值發(fā)送給瀏覽器保存烫罩;
Cookie cookie = new Cookie("JSESSIONID", sessionID); response.addCookie(cookie);
- 第二次訪問的時(shí)候惜傲,瀏覽器帶著JSESSIONID的cookie訪問服務(wù)器;
- 服務(wù)器得到JSESSIONID贝攒,在服務(wù)器的內(nèi)存中搜索是否存放對(duì)應(yīng)編號(hào)的session對(duì)象盗誊;
- 如果找到對(duì)應(yīng)編號(hào)的session對(duì)象,直接返回該對(duì)象;
- 如果找不到對(duì)應(yīng)編號(hào)的session對(duì)象哈踱,創(chuàng)建新的session對(duì)象荒适,繼續(xù)走1的流程。
Session的創(chuàng)建
當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)session時(shí)开镣,服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含sessionId刀诬,如果已包含則說(shuō)明以前已經(jīng)為此客戶端創(chuàng)建過session,服務(wù)器就按照sessionId把這個(gè)session檢索出來(lái)使用(檢索不到邪财,會(huì)新建一個(gè))陕壹,如果客戶端請(qǐng)求不包含sessionId,則為此客戶端創(chuàng)建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的sessionId树埠,sessionId的值是一個(gè)既不會(huì)重復(fù)糠馆,又不容易被找到規(guī)律以仿造的字符串,這個(gè)sessionId將被在本次響應(yīng)中返回給客戶端保存怎憋。
Cookie被禁用
如果客戶端禁用了cookie又碌,通常有兩種方法實(shí)現(xiàn)session而不依賴cookie。
URL重寫绊袋,就是把sessionId直接附加在URL路徑的后面毕匀。
-
表單隱藏字段。就是服務(wù)器會(huì)自動(dòng)修改表單愤炸,添加一個(gè)隱藏字段期揪,以便在表單提交時(shí)能夠把session id傳遞回服務(wù)器。比如:
<form name="testform" action="/xxx"> <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> <input type="text"> </form>
Session共享
對(duì)于多網(wǎng)站(同一父域不同子域)單服務(wù)器规个,我們需要解決的就是來(lái)自不同網(wǎng)站之間SessionId的共享。由于域名不同(aaa.test.com和bbb.test.com)姓建,而SessionId又分別儲(chǔ)存在各自的cookie中诞仓,因此服務(wù)器會(huì)認(rèn)為對(duì)于兩個(gè)子站的訪問,是來(lái)自不同的會(huì)話。解決的方法是通過修改cookies的域名為父域名達(dá)到cookie共享的目的,從而實(shí)現(xiàn)SessionId的共享速兔。帶來(lái)的弊端就是墅拭,子站間的cookie信息也同時(shí)被共享了。
總結(jié)
- cookie數(shù)據(jù)存放在客戶的瀏覽器上涣狗,session數(shù)據(jù)放在服務(wù)器上谍婉。
- cookie不是很安全,別人可以分析存放在本地的cookie并進(jìn)行cookie欺騙镀钓,考慮到安全應(yīng)當(dāng)使用session穗熬。
- session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多丁溅,會(huì)比較占用你服務(wù)器的性能唤蔗,考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用cookie。
- 單個(gè)cookie保存的數(shù)據(jù)不能超過4K妓柜,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie箱季。
- 可以考慮將登陸信息等重要信息存放為session,其他信息如果需要保留棍掐,可以放在cookie中藏雏。
Http協(xié)議基礎(chǔ)
什么是http協(xié)議
http協(xié)議:對(duì)瀏覽器客戶端和服務(wù)器端之間數(shù)據(jù)傳輸?shù)母袷揭?guī)范。
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=zhangsan&password=123456 --(可選)請(qǐng)求體
請(qǐng)求行
GET /days/hello HTTP/1.1
請(qǐng)求方法類型GET作煌,常見的請(qǐng)求方式:GET 掘殴、 POST、 HEAD最疆、 TRACE杯巨、 PUT、 CONNECT 努酸、DELETE服爷;
-
/days/hello為請(qǐng)求URL,如果是GET類型并有請(qǐng)求參數(shù)获诈,由仍源?和$拼接在URL上;
URL: 統(tǒng)一資源定位符舔涎。http://localhost:8080/days/testImg.html笼踩。只能定位互聯(lián)網(wǎng)資源。是URI 的子集亡嫌。
URI:統(tǒng)一資源標(biāo)記符嚎于。/days/hello。用于標(biāo)記任何資源挟冠∮诠海可以是本地文件系統(tǒng),局域網(wǎng)或者互聯(lián)網(wǎng)上的資源知染。 -
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)求頭
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)求訪問的目標(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í)間
請(qǐng)求體
name=zhangsan&password=123456 --POST提交的參數(shù)放在這里
HttpServletRequest對(duì)象
//1.請(qǐng)求行:
request.getMethod(); //請(qǐng)求方式
request.getRequetURI(); //獲取rui
request.getRequetURL(); //獲取url
request.getProtocol(); //請(qǐng)求http協(xié)議版本
//2.請(qǐng)求頭:
request.getHeader("名稱"); //根據(jù)請(qǐng)求頭獲取請(qǐng)求值
request.getHeaderNames(); //獲取所有的請(qǐng)求頭名稱
//3.實(shí)體內(nèi)容:
request.getInputStream(); //獲取實(shí)體內(nèi)容數(shù)據(jù)
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!!! --響應(yīng)體
響應(yīng)行
HTTP/1.1 200 OK
相應(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:保存連接
HttpServletResponse對(duì)象
//1.響應(yīng)行:
response.setStatus(); //設(shè)置狀態(tài)碼
//2.響應(yīng)頭:
response.setHeader("name","value"); //設(shè)置響應(yīng)頭
//3.實(shí)體內(nèi)容:
response.getWriter().writer(); //發(fā)送字符實(shí)體內(nèi)容
response.getOutputStream().writer() //發(fā)送字節(jié)實(shí)體內(nèi)容
重定向
resp.setStatus(302);
resp.setHeader("Location", "OtherServlet");
Http基礎(chǔ)
https與http區(qū)別
- https 協(xié)議需要到 ca 申請(qǐng)證書吧享,一般免費(fèi)證書較少魏割,因而需要一定費(fèi)用。
- http 是超文本傳輸協(xié)議钢颂,信息是明文傳輸钞它,https 則是具有安全性的 ssl 加密傳輸協(xié)議。
- http 和 https 使用的是完全不同的連接方式殊鞭,用的端口也不一樣遭垛,前者是 80,后者是 443操灿。
- http 的連接很簡(jiǎn)單锯仪,是無(wú)狀態(tài)的;HTTPS 協(xié)議是由 SSL+HTTP 協(xié)議構(gòu)建的可進(jìn)行加密傳輸趾盐、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議庶喜,比 http 協(xié)議安全。
https工作原理
客戶端在使用HTTPS 方式與Web 服務(wù)器通信時(shí)有以下幾個(gè)步驟:
- 客戶使用 https 的 URL 訪問 Web 服務(wù)器救鲤,要求與 Web 服務(wù)器建立 SSL 連接久窟。
- Web 服務(wù)器收到客戶端請(qǐng)求后,會(huì)將網(wǎng)站的證書信息(證書中包含公鑰)傳送一份給客戶端本缠。
- 客戶端的瀏覽器與 Web 服務(wù)器開始協(xié)商 SSL 連接的安全等級(jí)斥扛,也就是信息加密的等級(jí)。
- 客戶端的瀏覽器根據(jù)雙方統(tǒng)一的安全等級(jí)丹锹,建立會(huì)話密鑰稀颁,然后利用網(wǎng)站的公鑰將會(huì)話密鑰加密,并傳送給網(wǎng)站楣黍。
- Web 服務(wù)器利用自己的私鑰解密出會(huì)話密鑰峻村。
- Web 服務(wù)器利用會(huì)話密鑰加密與客戶端之間的通信。
[圖片上傳失敗...(image-d4d59c-1539677593281)]
https優(yōu)缺點(diǎn)
- HTTPS 協(xié)議握手階段比較費(fèi)時(shí)锡凝,會(huì)使頁(yè)面的加載時(shí)間延長(zhǎng)近 50%,增加 10% 到 20% 的耗電垢啼;
- HTTPS 連接緩存不如 HTTP 高效窜锯,會(huì)增加數(shù)據(jù)開銷和功耗,甚至已有的安全措施也會(huì)因此而受到影響芭析;
- SSL 證書需要錢锚扎,功能越強(qiáng)大的證書費(fèi)用越高,個(gè)人網(wǎng)站馁启、小網(wǎng)站沒有必要一般不會(huì)用驾孔。
- SSL 證書通常需要綁定 IP芍秆,不能在同一 IP 上綁定多個(gè)域名,IPv4 資源不可能支撐這個(gè)消耗翠勉。