64. jsp 和 servlet 有什麼區別? 65. jsp 的9個內置對象分別是什麼?做用是什麼? 66. 說一下 jsp 的 4 種做用域? 67. session 和 cookie 有什麼區別? 68. 說一下 session 的工做原理? 69. 若是客戶端禁止 cookie 能實現 session 還能用嗎? 70. spring mvc 和 struts 的區別是什麼? 71. 如何避免 sql 注入? 72. 什麼是 XSS 攻擊,如何避免? 73. 什麼是 CSRF 攻擊,如何避免?
Java Webjavascript
jsp簡介:
HTML擅長顯示頁面,可是它並不能調用Java代碼動態的生成內容;Servlet擅長調用Java程序,生成動態內容,可是Servlet不擅長顯示頁面。
jsp(Java Server Pages)結合了HTML和Servlet的優勢,本質上是運行在服務端的一個Servlet,Tomcat等Servlet容器會將jsp文件中的內容經過out.write()、out.print()等方法直接輸出給瀏覽器,瀏覽器獲取到的依然是一個html文檔,而後再進行渲染等html
JSP基本語法
一、模板元素
模板元素指就是JSP中的HTML代碼,模板元素的內容會做爲out.write()的參數,直接輸出到頁面中,在HTML中怎麼寫,在JSP中就怎麼寫
二、 腳本片斷
腳本片斷寫在 <% %>中,能夠在腳本片斷中直接編寫Java代碼,腳本片斷會原封不動的複製到java文件的service方法中的對應位置
三、表達式
JSP的表達式寫在<%= %>中,JSP表達式能夠將一個對象直接輸出到頁面中,JSP表達式中的內容最終會做爲out.print()方法的參數,輸出到頁面中
四、註釋
JSP的註釋寫在 <%-- --%>中
五、聲明
JSP中的聲明寫在<%! %>中
六、JSP指令
JSP指令的格式:<%@ 指令名 屬性名1=」屬性值1」 屬性名2=」屬性值2」 %>,舉例:
a、page指令:b、include指令c、taglib指令
七、JSP動做標籤格式:<jsp:標籤名 屬性名=「屬性值」></jsp:標籤名>
a、請求轉發java
<jsp:forward page=""></jsp:forward>
b、動態包含程序員
<jsp:include page="/include2/2.jsp"></jsp:include>
64. jsp 和 servlet 有什麼區別?正則表達式
65. jsp 的9個內置對象分別是什麼?做用是什麼?spring
JSP有9個內置對象:sql
66. 說一下 jsp 的 4 種做用域?跨域
JSP中的四種做用域包括page、request、session和application,具體來講:瀏覽器
67. session 和 cookie 有什麼區別?安全
一、存儲位置不一樣
cookie的數據信息存放在客戶端瀏覽器上。session的數據信息存放在服務器上。
二、存儲容量不一樣
單個cookie保存的數據<=4KB,一個站點最多保存20個Cookie。對於session來講並無上限,但出於對服務器端的性能考慮,session內不要存放過多的東西,而且設置session刪除機制。
三、存儲方式不一樣
cookie中只能保管ASCII字符串,並須要經過編碼方式存儲爲Unicode字符或者二進制數據。session中可以存儲任何類型的數據,包括且不限於string,integer,list,map等。
四、隱私策略不一樣
cookie對客戶端是可見的,因此它是不安全的。session存儲在服務器上,不存在敏感信息泄漏的風險。
五、有效期上不一樣
能夠經過設置cookie的屬性,達到使cookie長期有效的效果。Sessinon在用戶訪問第一次訪問服務器時建立,須要注意只有訪問JSP、Servlet等程序時纔會建立Session,只訪問HTML、IMAGE等靜態資源並不會建立Session,可調用request.getSession(true)強制生成Session。Tomcat中Session的默認失效時間爲20分鐘,只需關閉窗口該session就會失效,於是session不能達到長期有效的效果。session的過時時間是從session不活動的時候開始計算(若是session一直活動,session就總不會過時,從該Session未被訪問,開始計時; 一旦Session被訪問,計時清0);
六、服務器壓力不一樣
cookie保管在客戶端,不佔用服務器資源。對於併發用戶十分多的網站,cookie是很好的選擇。session是保管在服務器端的,每一個用戶都會產生一個session。假如併發訪問的用戶十分多,會產生十分多的session,耗費大量的內存。
七、瀏覽器支持不一樣
假如客戶端瀏覽器不支持cookie:
cookie是須要客戶端瀏覽器支持的,假如客戶端禁用了cookie,或者不支持cookie,則會話跟蹤會失效。session通常來講要配合cookie使用,若是用戶瀏覽器禁用了cookie,那麼只能使用URL重寫來實現session的存儲功能。
假如客戶端支持cookie:
cookie既可以設爲本瀏覽器窗口以及子窗口內有效,也可以設爲一切窗口內有效。session只能在本窗口以及子窗口內有效。
八、跨域支持上不一樣
cookie支持跨域名訪問。session不支持跨域名訪問。
68. 說一下 session 的工做原理?
session相似於map是鍵值對的形式存在的。經過session.getAttribute("name");獲取對應的name參數信息
當用戶訪問到一個服務器,若是服務器啓用Session,服務器就要爲該用戶建立一個session,在建立這個session的時候,服務器首先檢查這個用戶發來的請求裏是否包含了一個session id,若是存在就去遍歷服務端的session文件,找到與這個session id相對應的文件,文件中的key值即是session id,value爲當前用戶的一些信息,若是客戶端請求裏不包含有session id,則爲該客戶端建立一個session並生成一個與此session相關的session id。這個session id是惟一的、不重複的、不容易找到規律的字符串,這個session id將被在本次響應中返回到客戶端保存,而保存這個session id的正是cookie經過set-cookie完成,此後的請求都會交換這個 Session ID,進行有狀態的會話。
69. 若是客戶端禁止 cookie 能實現 session 還能用嗎?
Cookie與 Session,通常認爲是兩個獨立的東西,Session採用的是在服務器端保持狀態的方案,而Cookie採用的是在客戶端保持狀態的方案。
通常默認狀況下,在會話中,服務器存儲 session 的 session id 是經過 cookie 保存到瀏覽器裏。
若是瀏覽器禁用了 cookie,瀏覽器請求服務器沒法攜帶 session id,服務器沒法識別請求中的用戶身份,session就會失效。
可是能夠經過其餘方法在禁用 cookie 的狀況下,能夠繼續使用session。
70. spring mvc 和 struts 的區別是什麼?
Struts2是類級別的攔截,每次請求就會建立一個Action,和Spring整合時Struts2的ActionBean注入做用域是原型模式prototype,而後經過setter,getter吧request數據注入到屬性。Struts2中,一個Action對應一個request,response上下文,在接收參數時,能夠經過屬性接收,這說明屬性參數是讓多個方法共享的。Struts2中Action的一個方法能夠對應一個url,而其類屬性卻被全部方法共享,這也就沒法用註解或其餘方式標識其所屬方法了,只能設計爲多例。
SpringMVC是方法級別的攔截,一個方法對應一個Request上下文,因此方法直接基本上是獨立的,獨享request,response數據。而每一個方法同時又和一個url對應,參數的傳遞是直接注入到方法中的,是方法所獨有的。處理結果經過ModeMap返回給框架。在Spring整合時,SpringMVC的Controller Bean默認單例模式Singleton,因此默認對全部的請求,只會建立一個Controller,有應爲沒有共享的屬性,因此是線程安全的,若是要改變默認的做用域,須要添加@Scope註解修改。
Struts2有本身的攔截Interceptor機制,SpringMVC這是用的是獨立的Aop方式,這樣致使Struts2的配置文件量仍是比SpringMVC大。
Struts2採用Filter(StrutsPrepareAndExecuteFilter)實現,SpringMVC(DispatcherServlet)則採用Servlet實現。Filter在容器啓動以後即初始化;服務中止之後墜毀,晚於Servlet。Servlet在是在調用時初始化,先於Filter調用,服務中止後銷燬。
Struts2是類級別的攔截,每次請求對應實例一個新的Action,須要加載全部的屬性值注入,SpringMVC實現了零配置,因爲SpringMVC基於方法的攔截,有加載一次單例模式bean注入。因此,SpringMVC開發效率和性能高於Struts2。
spring MVC和Spring是無縫的。從這個項目的管理和安全上也比Struts2高。
71. 如何避免 sql 注入?
//構建sql語句,以?做爲佔位符 String sq = "delete from table1 where id=? and name=?" //建立PreparedStatement時就傳入sql語句,實現了預編譯 PreparedStatement ps = con.prepareStatement(sq); //設置sql語句的佔位符的值,注意第一個參數位置是1不是0 ps.setString(1,"03"); ps.setString(2,"mao"); //執行這個PreparedStatement ps.execute();
72. 什麼是 XSS 攻擊,如何避免?
XSS攻擊又稱CSS,全稱Cross Site Script (跨站腳本攻擊),其原理是攻擊者向有XSS漏洞的網站中輸入惡意的 HTML 代碼,當用戶瀏覽該網站時,這段 HTML 代碼會自動執行,從而達到攻擊的目的。XSS 攻擊相似於 SQL 注入攻擊,SQL注入攻擊中以SQL語句做爲用戶輸入,從而達到查詢/修改/刪除數據的目的,而在xss攻擊中,經過插入惡意腳本,實現對用戶遊覽器的控制,獲取用戶的一些信息。 XSS是 Web 程序中常見的漏洞,XSS 屬於被動式且用於客戶端的攻擊方式。
XSS防範的整體思路是:對輸入(和URL參數)進行過濾,對輸出進行編碼。
73. 什麼是 CSRF 攻擊,如何避免?
CSRF(Cross-site request forgery)也被稱爲 one-click attack或者 session riding,中文全稱是叫跨站請求僞造。通常來講,攻擊者經過僞造用戶的瀏覽器的請求,向訪問一個用戶本身曾經認證訪問過的網站發送出去,使目標網站接收並誤覺得是用戶的真實操做而去執行命令。經常使用於盜取帳號、轉帳、發送虛假消息等。攻擊者利用網站對請求的驗證漏洞而實現這樣的攻擊行爲,網站可以確認請求來源於用戶的瀏覽器,卻不能驗證請求是否源於用戶的真實意願下的操做行爲。
如何避免:
HTTP頭中的Referer字段記錄了該 HTTP 請求的來源地址。在一般狀況下,訪問一個安全受限頁面的請求來自於同一個網站,而若是黑客要對其實施 CSRF
攻擊,他通常只能在他本身的網站構造請求。所以,能夠經過驗證Referer值來防護CSRF 攻擊。
關鍵操做頁面加上驗證碼,後臺收到請求後經過判斷驗證碼能夠防護CSRF。但這種方法對用戶不太友好。
CSRF 攻擊之因此可以成功,是由於黑客能夠徹底僞造用戶的請求,該請求中全部的用戶驗證信息都是存在於cookie中,所以黑客能夠在不知道這些驗證信息的狀況下直接利用用戶本身的cookie 來經過安全驗證。要抵禦 CSRF,關鍵在於在請求中放入黑客所不能僞造的信息,而且該信息不存在於 cookie 之中。能夠在 HTTP 請求中以參數的形式加入一個隨機產生的 token,並在服務器端創建一個攔截器來驗證這個 token,若是請求中沒有token或者 token 內容不正確,則認爲多是 CSRF 攻擊而拒絕該請求。這種方法要比檢查 Referer 要安全一些,token 能夠在用戶登錄後產生並放於session之中,而後在每次請求時把token 從 session 中拿出,與請求中的 token 進行比對,但這種方法的難點在於如何把 token 以參數的形式加入請求。
對於 GET 請求,token 將附在請求地址以後,這樣 URL 就變成 http://url?csrftoken=tokenvalue。
而對於 POST 請求來講,要在 form 的最後加上 <input type="hidden" name="csrftoken" value="tokenvalue"/>,這樣就把token以參數的形式加入請求了。
這種方法也是使用 token 並進行驗證,和上一種方法不一樣的是,這裏並非把 token 以參數的形式置於 HTTP 請求之中,而是把它放到 HTTP 頭中自定義的屬性裏。經過 XMLHttpRequest 這個類,能夠一次性給全部該類請求加上 csrftoken 這個 HTTP 頭屬性,並把 token 值放入其中。這樣解決了上種方法在請求中加入 token 的不便,同時,經過 XMLHttpRequest 請求的地址不會被記錄到瀏覽器的地址欄,也不用擔憂 token 會透過 Referer 泄露到其餘網站中去。