64. jsp 和 servlet 有什么區(qū)別?
- jsp經(jīng)編譯后就變成了Servlet.(JSP的本質(zhì)就是Servlet平道,JVM只能識別java的類,不能識別JSP的代碼,Web容器將JSP的代碼編譯成JVM能夠識別的java類)
- jsp更擅長表現(xiàn)于頁面顯示恰响,servlet更擅長于邏輯控制税肪。
- Servlet中沒有內(nèi)置對象晾浴,Jsp中的內(nèi)置對象都是必須通過HttpServletRequest對象负乡,HttpServletResponse對象以及HttpServlet對象得到。
- Jsp是Servlet的一種簡化脊凰,使用Jsp只需要完成程序員需要輸出到客戶端的內(nèi)容抖棘,Jsp中的Java腳本如何鑲嵌到一個類中,由Jsp容器完成狸涌。而Servlet則是個完整的Java類切省,這個類的Service方法用于生成對客戶端的響應。
65. jsp 有哪些內(nèi)置對象帕胆?作用分別是什么朝捆?
JSP有9個內(nèi)置對象:
- request:封裝客戶端的請求,其中包含來自GET或POST請求的參數(shù)懒豹;
- response:封裝服務器對客戶端的響應芙盘;
- pageContext:通過該對象可以獲取其他對象;
- session:封裝用戶會話的對象歼捐;
- application:封裝服務器運行環(huán)境的對象何陆;
- out:輸出服務器響應的輸出流對象;
- config:Web應用的配置對象豹储;
- page:JSP頁面本身(相當于Java程序中的this);
- exception:封裝頁面拋出異常的對象淘这。
66. 說一下 jsp 的 4 種作用域剥扣?
JSP中的四種作用域包括page、request铝穷、session和application钠怯,具體來說:
- page代表與一個頁面相關(guān)的對象和屬性。
- request代表與Web客戶機發(fā)出的一個請求相關(guān)的對象和屬性曙聂。一個請求可能跨越多個頁面晦炊,涉及多個Web組件;需要在頁面顯示的臨時數(shù)據(jù)可以置于此作用域宁脊。
- session代表與某個用戶與服務器建立的一次會話相關(guān)的對象和屬性断国。跟某個用戶相關(guān)的數(shù)據(jù)應該放在用戶自己的session中。
- application代表與整個Web應用程序相關(guān)的對象和屬性榆苞,它實質(zhì)上是跨越整個Web應用程序稳衬,包括多個頁面、請求和會話的一個全局作用域坐漏。
67. session 和 cookie 有什么區(qū)別薄疚?
- 由于HTTP協(xié)議是無狀態(tài)的協(xié)議碧信,所以服務端需要記錄用戶的狀態(tài)時,就需要用某種機制來識具體的用戶街夭,這個機制就是Session.典型的場景比如購物車砰碴,當你點擊下單按鈕時,由于HTTP協(xié)議無狀態(tài)板丽,所以并不知道是哪個用戶操作的衣式,所以服務端要為特定的用戶創(chuàng)建了特定的Session,用用于標識這個用戶檐什,并且跟蹤用戶碴卧,這樣才知道購物車里面有幾本書。這個Session是保存在服務端的乃正,有一個唯一標識住册。在服務端保存Session的方法很多,內(nèi)存瓮具、數(shù)據(jù)庫荧飞、文件都有。集群的時候也要考慮Session的轉(zhuǎn)移名党,在大型的網(wǎng)站叹阔,一般會有專門的Session服務器集群,用來保存用戶會話传睹,這個時候 Session 信息都是放在內(nèi)存的耳幢,使用一些緩存服務比如Memcached之類的來放 Session。
- 思考一下服務端如何識別特定的客戶欧啤?這個時候Cookie就登場了睛藻。每次HTTP請求的時候,客戶端都會發(fā)送相應的Cookie信息到服務端邢隧。實際上大多數(shù)的應用都是用 Cookie 來實現(xiàn)Session跟蹤的店印,第一次創(chuàng)建Session的時候,服務端會在HTTP協(xié)議中告訴客戶端倒慧,需要在 Cookie 里面記錄一個Session ID按摘,以后每次請求把這個會話ID發(fā)送到服務器,我就知道你是誰了纫谅。有人問炫贤,如果客戶端的瀏覽器禁用了 Cookie 怎么辦?一般這種情況下系宜,會使用一種叫做URL重寫的技術(shù)來進行會話跟蹤照激,即每次HTTP交互,URL后面都會被附加上一個諸如 sid=xxxxx 這樣的參數(shù)盹牧,服務端據(jù)此來識別用戶俩垃。
- Cookie其實還可以用在一些方便用戶的場景下励幼,設(shè)想你某次登陸過一個網(wǎng)站,下次登錄的時候不想再次輸入賬號了口柳,怎么辦苹粟?這個信息可以寫到Cookie里面,訪問網(wǎng)站的時候跃闹,網(wǎng)站頁面的腳本可以讀取這個信息嵌削,就自動幫你把用戶名給填了,能夠方便一下用戶望艺。這也是Cookie名稱的由來苛秕,給用戶的一點甜頭。所以找默,總結(jié)一下:Session是在服務端保存的一個數(shù)據(jù)結(jié)構(gòu)艇劫,用來跟蹤用戶的狀態(tài),這個數(shù)據(jù)可以保存在集群惩激、數(shù)據(jù)庫店煞、文件中;Cookie是客戶端保存用戶信息的一種機制风钻,用來記錄用戶的一些信息顷蟀,也是實現(xiàn)Session的一種方式。
68. 說一下 session 的工作原理骡技?
其實session是一個存在服務器上的類似于一個散列表格的文件鸣个。里面存有我們需要的信息,在我們需要用的時候可以從里面取出來哮兰。類似于一個大號的map吧毛萌,里面的鍵存儲的是用戶的sessionid,用戶向服務器發(fā)送請求的時候會帶上這個sessionid喝滞。這時就可以從中取出對應的值了。
69. 如果客戶端禁止 cookie 能實現(xiàn) session 還能用嗎膏秫?
Cookie與 Session右遭,一般認為是兩個獨立的東西,Session采用的是在服務器端保持狀態(tài)的方案缤削,而Cookie采用的是在客戶端保持狀態(tài)的方案窘哈。但為什么禁用Cookie就不能得到Session呢?因為Session是用Session ID來確定當前對話所對應的服務器Session亭敢,而Session ID是通過Cookie來傳遞的滚婉,禁用Cookie相當于失去了Session ID,也就得不到Session了帅刀。
假定用戶關(guān)閉Cookie的情況下使用Session让腹,其實現(xiàn)途徑有以下幾種:
- 設(shè)置php.ini配置文件中的“session.use_trans_sid = 1”远剩,或者編譯時打開打開了“--enable-trans-sid”選項,讓PHP自動跨頁傳遞Session ID骇窍。
- 手動通過URL傳值瓜晤、隱藏表單傳遞Session ID。
- 用文件腹纳、數(shù)據(jù)庫等形式保存Session ID痢掠,在跨頁過程中手動調(diào)用。
70. spring mvc 和 struts 的區(qū)別是什么嘲恍?
攔截機制的不同
- Struts2是類級別的攔截足画,每次請求就會創(chuàng)建一個Action,和Spring整合時Struts2的ActionBean注入作用域是原型模式prototype佃牛,然后通過setter淹辞,getter吧request數(shù)據(jù)注入到屬性。Struts2中吁脱,一個Action對應一個request桑涎,response上下文,在接收參數(shù)時兼贡,可以通過屬性接收攻冷,這說明屬性參數(shù)是讓多個方法共享的。Struts2中Action的一個方法可以對應一個url遍希,而其類屬性卻被所有方法共享等曼,這也就無法用注解或其他方式標識其所屬方法了,只能設(shè)計為多例凿蒜。
- SpringMVC是方法級別的攔截禁谦,一個方法對應一個Request上下文,所以方法直接基本上是獨立的废封,獨享request州泊,response數(shù)據(jù)。而每個方法同時又何一個url對應漂洋,參數(shù)的傳遞是直接注入到方法中的遥皂,是方法所獨有的。處理結(jié)果通過ModeMap返回給框架刽漂。在Spring整合時演训,SpringMVC的Controller Bean默認單例模式Singleton,所以默認對所有的請求贝咙,只會創(chuàng)建一個Controller样悟,有應為沒有共享的屬性,所以是線程安全的,如果要改變默認的作用域窟她,需要添加@Scope注解修改陈症。
- Struts2有自己的攔截Interceptor機制,SpringMVC這是用的是獨立的Aop方式礁苗,這樣導致Struts2的配置文件量還是比SpringMVC大爬凑。
底層框架的不同
Struts2采用Filter(StrutsPrepareAndExecuteFilter)實現(xiàn),SpringMVC(DispatcherServlet)則采用Servlet實現(xiàn)试伙。Filter在容器啟動之后即初始化嘁信;服務停止以后墜毀,晚于Servlet疏叨。Servlet在是在調(diào)用時初始化潘靖,先于Filter調(diào)用,服務停止后銷毀蚤蔓。
性能方面
Struts2是類級別的攔截卦溢,每次請求對應實例一個新的Action,需要加載所有的屬性值注入秀又,SpringMVC實現(xiàn)了零配置单寂,由于SpringMVC基于方法的攔截,有加載一次單例模式bean注入吐辙。所以宣决,SpringMVC開發(fā)效率和性能高于Struts2。
配置方面
spring MVC和Spring是無縫的昏苏。從這個項目的管理和安全上也比Struts2高尊沸。
71. 如何避免 sql 注入?
- PreparedStatement(簡單又有效的方法)
- 使用正則表達式過濾傳入的參數(shù)
- 字符串過濾
- JSP中調(diào)用該函數(shù)檢查是否包函非法字符
- JSP頁面判斷代碼
72. 什么是 XSS 攻擊贤惯,如何避免洼专?
XSS攻擊又稱CSS,全稱Cross Site Script (跨站腳本攻擊),其原理是攻擊者向有XSS漏洞的網(wǎng)站中輸入惡意的 HTML 代碼孵构,當用戶瀏覽該網(wǎng)站時屁商,這段 HTML 代碼會自動執(zhí)行,從而達到攻擊的目的颈墅。XSS 攻擊類似于 SQL 注入攻擊棒假,SQL注入攻擊中以SQL語句作為用戶輸入,從而達到查詢/修改/刪除數(shù)據(jù)的目的精盅,而在xss攻擊中讯检,通過插入惡意腳本渔嚷,實現(xiàn)對用戶游覽器的控制,獲取用戶的一些信息嚷往。 XSS是 Web 程序中常見的漏洞僻族,XSS 屬于被動式且用于客戶端的攻擊方式粘驰。
XSS防范的總體思路是:對輸入(和URL參數(shù))進行過濾屡谐,對輸出進行編碼。
73. 什么是 CSRF 攻擊蝌数,如何避免愕掏?
CSRF(Cross-site request forgery)也被稱為 one-click attack或者 session riding,中文全稱是叫跨站請求偽造顶伞。一般來說饵撑,攻擊者通過偽造用戶的瀏覽器的請求,向訪問一個用戶自己曾經(jīng)認證訪問過的網(wǎng)站發(fā)送出去唆貌,使目標網(wǎng)站接收并誤以為是用戶的真實操作而去執(zhí)行命令滑潘。常用于盜取賬號、轉(zhuǎn)賬锨咙、發(fā)送虛假消息等语卤。攻擊者利用網(wǎng)站對請求的驗證漏洞而實現(xiàn)這樣的攻擊行為,網(wǎng)站能夠確認請求來源于用戶的瀏覽器酪刀,卻不能驗證請求是否源于用戶的真實意愿下的操作行為粹舵。
如何避免:
1. 驗證 HTTP Referer 字段
HTTP頭中的Referer字段記錄了該 HTTP 請求的來源地址。在通常情況下骂倘,訪問一個安全受限頁面的請求來自于同一個網(wǎng)站眼滤,而如果黑客要對其實施 CSRF 攻擊,他一般只能在他自己的網(wǎng)站構(gòu)造請求稠茂。因此柠偶,可以通過驗證Referer值來防御CSRF 攻擊。
2. 使用驗證碼
關(guān)鍵操作頁面加上驗證碼睬关,后臺收到請求后通過判斷驗證碼可以防御CSRF诱担。但這種方法對用戶不太友好。
3. 在請求地址中添加token并驗證
CSRF 攻擊之所以能夠成功电爹,是因為黑客可以完全偽造用戶的請求蔫仙,該請求中所有的用戶驗證信息都是存在于cookie中,因此黑客可以在不知道這些驗證信息的情況下直接利用用戶自己的cookie 來通過安全驗證丐箩。要抵御 CSRF摇邦,關(guān)鍵在于在請求中放入黑客所不能偽造的信息,并且該信息不存在于 cookie 之中屎勘∈┘可以在 HTTP 請求中以參數(shù)的形式加入一個隨機產(chǎn)生的 token,并在服務器端建立一個攔截器來驗證這個 token概漱,如果請求中沒有token或者 token 內(nèi)容不正確丑慎,則認為可能是 CSRF 攻擊而拒絕該請求。這種方法要比檢查 Referer 要安全一些,token 可以在用戶登陸后產(chǎn)生并放于session之中竿裂,然后在每次請求時把token 從 session 中拿出玉吁,與請求中的 token 進行比對,但這種方法的難點在于如何把 token 以參數(shù)的形式加入請求腻异。 對于 GET 請求进副,token 將附在請求地址之后,這樣 URL 就變成 http://url?csrftoken=tokenvalue悔常。 而對于 POST 請求來說影斑,要在 form 的最后加上 <input type="hidden" name="csrftoken" value="tokenvalue"/>,這樣就把token以參數(shù)的形式加入請求了这嚣。
4. 在HTTP 頭中自定義屬性并驗證
這種方法也是使用 token 并進行驗證鸥昏,和上一種方法不同的是,這里并不是把 token 以參數(shù)的形式置于 HTTP 請求之中姐帚,而是把它放到 HTTP 頭中自定義的屬性里吏垮。通過 XMLHttpRequest 這個類,可以一次性給所有該類請求加上 csrftoken 這個 HTTP 頭屬性罐旗,并把 token 值放入其中膳汪。這樣解決了上種方法在請求中加入 token 的不便,同時九秀,通過 XMLHttpRequest 請求的地址不會被記錄到瀏覽器的地址欄遗嗽,也不用擔心 token 會透過 Referer 泄露到其他網(wǎng)站中去。