面試-Java Web

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 有什麼區別?正則表達式

  1. jsp經編譯後就變成了Servlet.(JSP的本質就是Servlet,JVM只能識別java的類,不能識別JSP的代碼,Web容器將JSP的代碼編譯成JVM可以識別的java類)
  2. jsp更擅長表現於頁面顯示,servlet更擅長於邏輯控制。
  3. Servlet中沒有內置對象,Jsp中的內置對象都是必須經過HttpServletRequest對象,HttpServletResponse對象以及HttpServlet對象獲得。
  4. Jsp是Servlet的一種簡化,使用Jsp只須要完成程序員須要輸出到客戶端的內容,Jsp中的Java腳本如何鑲嵌到一個類中,由Jsp容器完成。而Servlet則是個完整的Java類,這個類的Service方法用於生成對客戶端的響應。

65. jsp 的9個內置對象分別是什麼?做用是什麼?spring

JSP有9個內置對象:sql

  • request:封裝客戶端的請求,其中包含來自GET或POST請求的參數;
  • response:封裝服務器對客戶端的響應;
  • pageContext:經過該對象能夠獲取其餘對象;
  • session:封裝用戶會話的對象;
  • application:封裝服務器運行環境的對象;
  • out:輸出服務器響應的輸出流對象;
  • config:Web應用的配置對象;
  • page:JSP頁面自己(至關於Java程序中的this);
  • exception:封裝頁面拋出異常的對象。

66. 說一下 jsp 的 4 種做用域?跨域

JSP中的四種做用域包括page、request、session和application,具體來講:瀏覽器

  • pageContext對象,最小的域對象,能夠在當前頁面中共享數據,一旦切換頁面,則域中的屬性就會丟失,該對象主要用來向標籤中傳遞數據。
  • request對象,能夠在一次請求中共享數據,一旦發送屢次請求,則域中的屬性就會丟失。主要用於在轉發時共享數據(request域中屬性在轉發時有效,重定向時無效)。
  • session對象,能夠在一次會話中共享數據,一旦會話結束則域中的屬性丟失。會話:就是一次打開關閉瀏覽器的過程。
  • application對象,是最大的域對象,做用範圍是整個項目,只要不關閉服務器則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。

  1. 經過url重寫把 session id 做爲參數追加的原 url 中,後續的瀏覽器與服務器交互中攜帶 session id 參數。
  2. 服務器的返回數據中包含 session id,瀏覽器發送請求時,攜帶 session id 參數
  3. 經過 Http 協議其餘 header 字段,服務器每次返回時設置該 header 字段信息,瀏覽器中 js 讀取該 header 字段,請求服務器時,js設置攜帶該 header 字段。

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 注入?

  1. PreparedStatement(簡單又有效的方法)
    採用預編譯語句集,輸出的SQL是把整個參數用引號包起來,並把參數中的引號做爲轉義字符,從而避免了參數也做爲條件的一部分,只要使用它的setXXX方法傳值便可
    sql注入只對sql語句的準備(編譯)過程有破壞做用,PreparedStatement參數不是簡單拼接生成sql,而是先用?佔位,以後再根據參數產生sql,所以也就避免了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();
  1. 使用正則表達式過濾傳入的參數
  2. 字符串過濾
  3. JSP中調用該函數檢查是否包函非法字符
  4. JSP頁面判斷代碼
    使用javascript在客戶端進行不安全字符屏蔽
    功能介紹:檢查是否含有」‘」,」\」,」/」

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,中文全稱是叫跨站請求僞造。通常來講,攻擊者經過僞造用戶的瀏覽器的請求,向訪問一個用戶本身曾經認證訪問過的網站發送出去,使目標網站接收並誤覺得是用戶的真實操做而去執行命令。經常使用於盜取帳號、轉帳、發送虛假消息等。攻擊者利用網站對請求的驗證漏洞而實現這樣的攻擊行爲,網站可以確認請求來源於用戶的瀏覽器,卻不能驗證請求是否源於用戶的真實意願下的操做行爲。

如何避免:

  1. 驗證 HTTP Referer 字段
HTTP頭中的Referer字段記錄了該 HTTP 請求的來源地址。在一般狀況下,訪問一個安全受限頁面的請求來自於同一個網站,而若是黑客要對其實施 CSRF
攻擊,他通常只能在他本身的網站構造請求。所以,能夠經過驗證Referer值來防護CSRF 攻擊。
  1. 使用驗證碼
關鍵操做頁面加上驗證碼,後臺收到請求後經過判斷驗證碼能夠防護CSRF。但這種方法對用戶不太友好。
  1. 在請求地址中添加token並驗證
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以參數的形式加入請求了。
  1. 在HTTP 頭中自定義屬性並驗證
這種方法也是使用 token 並進行驗證,和上一種方法不一樣的是,這裏並非把 token 以參數的形式置於 HTTP 請求之中,而是把它放到 HTTP 頭中自定義的屬性裏。經過 XMLHttpRequest 這個類,能夠一次性給全部該類請求加上 csrftoken 這個 HTTP 頭屬性,並把 token 值放入其中。這樣解決了上種方法在請求中加入 token 的不便,同時,經過 XMLHttpRequest 請求的地址不會被記錄到瀏覽器的地址欄,也不用擔憂 token 會透過 Referer 泄露到其餘網站中去。
相關文章
相關標籤/搜索