面試知識點六:Java Web

64.jsp 和 servlet 有什麼區別?php

65.jsp 有哪些內置對象?做用分別是什麼?css

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

67.session 和 cookie 有什麼區別?前端

68.說一下 session 的工做原理?java

69.若是客戶端禁止 cookie 能實現 session 還能用嗎?web

70.spring mvc 和 struts 的區別是什麼?算法

71.如何避免 sql 注入?spring

72.什麼是 XSS 攻擊,如何避免?sql

73.什麼是 CSRF 攻擊,如何避免?數據庫

 

64.jsp 和 servlet 有什麼區別?

首先來看一下Servlet:Java服務器小程序(Server Applet)

  事實上,Servlet不復雜,它只是一個接口,而接口的做用是什麼,規範。

servlet接口定義的是一套處理網絡請求的規範,全部實現servlet的類,都須要實現它那五個方法,其中最主要的是兩個生命週期方法 init()和destroy(),還有一個處理請求的service(),也就是說,全部實現servlet接口的類,或者說,全部想要處理網絡請求的類,都須要回答這三個問題:

  • 你初始化時要作什麼
  • 你銷燬時要作什麼
  • 你接受到請求時要作什麼

這是Java給的一種規範!servlet是一個規範,那實現了servlet的類,就能處理請求了嗎?答案是,不能。

看一下service方法的說明,該方法是被servlet container即servlet容器調用來響應請求的,好比咱們最經常使用的Tomcat容器。

因此,servlet不直接和客戶端打交道,而是經過Tomcat,Tomcat監聽了端口,請求過來後,根據url等信息,肯定要將請求交給哪一個servlet去處理,而後調用那個servlet的service方法,service方法返回一個response對象,tomcat再把這個response返回給客戶端。

/** * Defines methods that all servlets must implement. * * <p> * A servlet is a small Java program that runs within a Web server. Servlets * receive and respond to requests from Web clients, usually across HTTP, the * HyperText Transfer Protocol. */
public interface Servlet { /** * Called by the servlet container to allow the servlet to respond to a * request. */
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; }

servlet的本質是什麼,它是如何工做的?

servlet容器與tomcat容器的區別

Servlet應用沒法獨立運行,必須運行在Servlet容器中。Tomcat 是Web應用服務器,就是一個Servlet/JSP容器。Servlet容器將用戶的請求傳遞給Servlet應用,並將結果返回給用戶。Web服務器和Web客戶端間經過HTTP協議通訊,所以Web服務器也叫HTTP服務器。像下圖

 

接着看一下JSP: Java Server Pages,直譯就是運行在服務器端的頁面,是Sun 公司指定的一種服務器端動態頁面技術的組件規範,Jsp是以「.jsp」爲後綴的文件,在該文件中主要是html 和少許的java 代碼。jsp 文件在容器中會轉換成Servlet去執行。

當有人請求JSP時,服務器內部會經歷一次動態資源(JSP)到靜態資源(HTML)的轉化,服務器會自動幫咱們把JSP中的HTML片斷和數據拼接成靜態資源響應給瀏覽器。也就是說JSP是運行在服務器端,但最終發給客戶端的都已是轉換好的HTML靜態頁面(在響應體裏)。

即:JSP = HTML + Java片斷(各類標籤本質上仍是Java片斷)

淺談JSP

因此:簡單總結一下servelet與JSP的區別:

一、運行過程
    客戶在第一次請求JSP時,請求較慢,由於JSP Engine先把JSP程序轉換成servlet代碼,接着將它編譯成類文件,之後貯存在內存中再次調用速度就快了;
    訪問servlet時,能夠直接對其編譯好的類文件執行。

二、使用方式
    要想使用servlet必須把它放在特定位置並且必須對其映射配置;
    jsp能夠放在和html一樣位置(webapps根目錄下或者webapps根目錄下的子目錄下)並且不須要配置,能夠直接使用。

三、程序組成
    Servlet在Java代碼中經過HttpServletResponse對象動態輸出HTML內容;
    JSP在靜態HTML內容中嵌入Java代碼,Java代碼被動態執行後生成HTML內容

四、職能分工
    jsp更側重於前端頁面顯示,servlet更側重於業務邏輯。

五、本是一家人
    Jsp 本質上是servlet,用jsp實現的頁面用servlet也能實現。

Jsp和Servlet有什麼區別? 

淺談Servlet與JSP

最後,servlet和JSP經過MVC雙劍合璧

各自的特色

  • Servlet可以很好地組織業務邏輯代碼,可是在Java源文件中經過字符串拼接的方式生成動態HTML內容會致使代碼維護困難、可讀性差
  • JSP雖然規避了Servlet在生成HTML內容方面的劣勢,可是在HTML中混入大量、複雜的業務邏輯一樣也是不可取的

既然JSP和Servlet都有自身的適用環境,那麼可否揚長避短,讓它們發揮各自的優點呢?答案是確定的——MVC(Model-View-Controller)模式很是適合解決這一問題。

MVC模式(Model-View-Controller)是軟件工程中的一種軟件架構模式,把軟件系統分爲三個基本部分:模型(Model)、視圖(View)和控制器(Controller):

  • Controller——負責轉發請求,對請求進行處理
  • View——負責界面顯示
  • Model——業務功能編寫(例如算法實現)、數據庫設計以及數據存取操做實現

在JSP/Servlet開發的軟件系統中,這三個部分的描述以下所示:

&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;img src="https://pic2.zhimg.com/50/229cf9ff5b1729eaf408fac56238eeb3_hd.jpg" data-rawwidth="842" data-rawheight="326" class="origin_image zh-lightbox-thumb" width="842" data-original="https://pic2.zhimg.com/229cf9ff5b1729eaf408fac56238eeb3_r.jpg"/&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;

 


  1. Web瀏覽器發送HTTP請求到服務端,被Controller(Servlet)獲取並進行處理(例如參數解析、請求轉發)
  2. Controller(Servlet)調用核心業務邏輯——Model部分,得到結果
  3. Controller(Servlet)將邏輯處理結果交給View(JSP),動態輸出HTML內容
  4. 動態生成的HTML內容返回到瀏覽器顯示

MVC模式在Web開發中的好處是很是明顯,它規避了JSP與Servlet各自的短板,Servlet只負責業務邏輯而不會經過out.append()動態生成HTML代碼;JSP中也不會充斥着大量的業務代碼。這大大提升了代碼的可讀性和可維護性。

注意:MVC是web開發都有的一種模式,好比PHP開發web時也有MVC模式。而三層架構則是JavaEE的:Controller/Service/Dao。分層開發是爲了使代碼邏輯更加清晰,也起到了必定的解耦合做用。

65.jsp 有哪些內置對象?做用分別是什麼?

在jsp開發中會頻繁使用到一些對象,如ServletContext HttpSession PageContext等.若是每次咱們在jsp頁面中須要使用這些對象都要本身親自動手建立就會特別的繁瑣.SUN公司所以在設計jsp時,在jsp頁面加載完畢以後自動幫開發者建立好了這些對象,開發者只須要使用相應的對象調用相應的方法便可.這些系統建立好的對象就叫作內置對象.

在servlet程序中,若是開發者但願使用session對象,必須經過request.getSession()來獲得session對象;而在jsp程序中,開發中可直接使用session(系統幫咱們建立好的session對象的名字就叫session)調用相應的方法便可,如:session.getId().

JSP中一共預先定義了9個這樣的對象,分別爲:request、response、session、application、out、pagecontext、config、page、exception

內置對象(又叫隱含對象)特色: 
1. 由JSP規範提供,不用編寫者實例化。 
2. 經過Web容器實現和管理 
3. 全部JSP頁面都可使用 
4. 只有在腳本元素的表達式或代碼段中才可以使用(<%=使用內置對象%>或<%使用內置對象%>)

對象名 功能 類型 做用域
request 向客戶端請求數據 javax.servlet.ServletRequest Request
response 封裝了jsp產生的響應,而後被髮送到客戶端以響應客戶的請求 javax.servlet.SrvletResponse Page
pageContext 爲JSP頁面包裝頁面的上下文。管理對屬於JSP中特殊可見部分中己經命名對象的該問 javax.servlet.jsp.PageContext Page
session 用來保存每一個用戶的信息,以便跟蹤每一個用戶的操做狀態 javax.servlet.http.HttpSession Session
application 應用程序對象 javax.servlet.ServletContext Application
out 向客戶端輸出數據 javax.servlet.jsp.JspWriter Page
config 表示Servlet的配置,當一個Servlet初始化時,容器把某些信息經過此對象傳遞給這個Servlet javax.servlet.ServletConfig Page
page Jsp實現類的實例,它是jsp自己,經過這個能夠對它進行訪問 javax.lang.Object Page
exception 反映運行的異常 javax.lang.Throwable Page

JSP九大內置對象及其做用+四大域對象

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

分類:

  1. ServletContext     application域(context域  )
  2. HttpServletRequet  request域  
  3. HttpSession        session域     --前三種在學習Servlet時就能接觸到  
  4. PageContext        page域     --jsp學習的  

域對象的做用:保存數據,獲取數據,共享數據.

保存數據:Context.setAttribute("內容");//默認保存到page域  

  1. pageContext.setAttribute("內容",域範圍常量);//保存到指定域中  
  2. //四個域常量  
  3. PageContext.PAGE_SCOPE  
  4. PageContext.REQUEST_SCOPE  
  5. PageContext..SESSION_SCOPE  
  6. PageContext.APPLICATION_SCOPE  

獲取數據:

  1. pageContext.getAttribute("內容");  pageContext.getAttribute("name",域範圍常量);

   //自動在四個域中搜索數據 pageContext.findAttribute("內容");//在四個域中自動搜索數據,順序:page域->request域->session域->application域(context域)

域做用範圍:

  1. page域:    只能在當前jsp頁面使用                (當前頁面)  
  2. request域: 只能在同一個請求中使用               (轉發)  
  3. session域: 只能在同一個會話(session對象)中使用  (私有的)  
  4. context域: 只能在同一個web應用中使用            (全局的)

67.session 和 cookie 有什麼區別?

  首先明白爲何須要session和cookie?

  由於HTTP協議是無鏈接無狀態的。無鏈接: 一個請求完畢後,會斷開鏈接,不會保持。無狀態:http自己不會存儲客戶端和服務器在臨時會話中產生的數據,而是經過客戶端添加cookie機制與服務器添加session機制實現會話期間緩存產生的數據。好比你看到的網站啊,論壇啊,能記住你的密碼,記住你的登錄狀態,那是用cookie和session實現的,和HTTP無關。

  http協議無狀態中的 "狀態" 到底指的是什麼?!

  什麼是Http無狀態?Session、Cookie、Token三者之間的區別

  session與cookie:Cookie經過在客戶端記錄信息肯定用戶身份,Session經過在服務器端記錄信息肯定用戶身份。

  因爲HTTP是一種無狀態的協議,服務器單從網絡鏈接上無從知道客戶身份。怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,不管誰訪問都必須攜帶本身通行證。這樣服務器就能從通行證上確認客戶身份了。這就是Cookie的工做原理

  Cookie其實是一小段的文本信息。客戶端請求服務器,若是服務器須要記錄該用戶狀態,就使用response向客 戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務 器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還能夠根據須要修改Cookie的內容。

   Cookie和Session詳解

  Session是另外一種記錄客戶狀態的機制,不一樣的是Cookie保存在客戶端瀏覽器中,而Session保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上。這就是Session。客戶端瀏覽器再次訪問時只須要從該Session中查找該客戶的狀態就能夠了。

  雖然Session保存在服務器,對客戶端是透明的,它的正常運行仍然須要客戶端瀏覽器的支持。這是由於Session 須要使用Cookie做爲識別標誌。HTTP協議是無狀態的,Session不能依據HTTP鏈接來判斷是否爲同一客戶,所以服務器向客戶端瀏覽器發送一 個名爲JSESSIONID的Cookie,它的值爲該Session的id(也就是HttpSession.getId()的返回值)。Session 依據該Cookie來識別是否爲同一用戶。該Cookie爲服務器自動生成的,它的maxAge屬性通常爲–1,表示僅當前瀏覽器內有效,而且各瀏覽器窗口間不共享,關閉瀏覽器就會失效。

  總結一下session與cookie的區別:

  • 保持狀態:cookie保存在瀏覽器端,session保存在服務器端
  • 使用方式:

    (1)cookie機制:若是不在瀏覽器中設置過時時間,cookie被保存在內存中,生命週期隨瀏覽器的關閉而結束,這種cookie簡稱會話cookie。若是在瀏覽器中設置了cookie的過時時間,cookie被保存在硬盤中,關閉瀏覽器後,cookie數據仍然存在,直到過時時間結束才消失。

         Cookie是服務器發給客戶端的特殊信息,cookie是以文本的方式保存在客戶端,每次請求時都帶上它

    (2)session機制:當服務器收到請求須要建立session對象時,首先會檢查客戶端請求中是否包含sessionid。若是有sessionid,服務器將根據該id返回對應session對象。若是客戶端請求中沒有sessionid,服務器會建立新的session對象,並把sessionid在本次響應中返回給客戶端。一般使用cookie方式存儲sessionid到客戶端,在交互中瀏覽器按照規則將sessionid發送給服務器。若是用戶禁用cookie,則要使用URL重寫,能夠經過response.encodeURL(url) 進行實現;API對encodeURL的結束爲,當瀏覽器支持Cookie時,url不作任何處理;當瀏覽器不支持Cookie的時候,將會重寫URL將SessionID拼接到訪問地址後。

  • 存儲內容:cookie只能保存字符串類型,以文本的方式;session經過相似於Hashtable的數據結構來保存,能支持任何類型的對象(session中可含有多個對象)
  • 存儲的大小:cookie:單個cookie保存的數據不能超過4kb;session大小沒有限制。
  • 安全性:cookie:針對cookie所存在的攻擊:Cookie欺騙,Cookie截獲;session的安全性大於cookie。

      緣由以下:(1)sessionID存儲在cookie中,若要攻破session首先要攻破cookie;

           (2)sessionID是要有人登陸,或者啓動session_start纔會有,因此攻破cookie也不必定能獲得sessionID;

           (3)第二次啓動session_start後,前一次的sessionID就是失效了,session過時後,sessionID也隨之失效。

           (4)sessionID是加密的

           (5)綜上所述,攻擊者必須在短期內攻破加密的sessionID,這很難。

  • 應用場景和缺點等等  參考資料:淺談session,cookie,sessionStorage,localStorage的區別及應用場景

68.說一下 session 的工做原理?

  Session字面含義就是會話。因爲HTTP是無狀態協議,爲了保持瀏覽器與服務器之間的聯繫,纔有了Session。Session就是用於在服務器端保存用戶狀態的協議。一般用來保存用戶的登陸狀態。

  工做原理:

  Session內容保存在服務器端的,一般是保存在內存中,固然也能夠保存在文件、數據庫等等。客戶端跟服務器端經過SessionId來關聯, SessionId一般以Cookie的形式存儲在客戶端。每次HTTP請求,SessionId都會隨着Cookie被傳遞到服務器端,這樣就能夠經過SessionId取到對應的信息,來判斷這個請求來自於哪一個客戶端/用戶。

  添加購物車場景示例:

  • 核心對象&職責

對象

職責

SessionId

負責標識客戶端/用戶

HTTP

負責傳遞SessionId

Cookie

負責保存SessionId

服務器

負責保存Session內容

Session的工做原理和使用經驗

69.若是客戶端禁止 cookie 能實現 session 還能用嗎?

   此處cookie的做用是HTTP請求時傳遞sessionID,不經過cookie也能夠傳遞,即經過URL地址重寫。

  URL地址重寫是對客戶端不支持Cookie的解決方案。URL地址重寫的原理是將該用戶Session的id信息重寫 到URL地址中。服務器可以解析重寫後的URL獲取Session的id。這樣即便客戶端不支持Cookie,也可使用Session來記錄用戶狀態。 

70.spring mvc 的工做原理?

  首先用戶發送請求——>DispatcherServlet,DispatcherServlet——>HandlerMapping匹配到具體的URL,再經過HandlerAdapter調用具體的HandlerMethod,當Handler執行完成後返回ModelAndView,會被ViewResolver解析,調用具體的物理視圖。最終響應給客戶端瀏覽器。

  SpringMVC工做原理

71.如何避免 sql 注入?

  SQL注入指的是發生在Web應用對後臺數據庫查詢語句處理存在的安全漏洞,簡單的說,就是在輸入字符串中嵌入SQL指令,在設計程序中忽略了對特殊字符串的檢查,這些嵌入的指令便會被誤認爲正常的SQL指令,在數據庫中執行,所以能夠對後臺數據庫進行查看等工做,甚至破快後臺數據庫形成嚴重後果。

  避免SQL注入的方法:

  • 輸入驗證:檢查用戶輸入的合法性,儘可能的限制用戶輸入特殊的符號,確信輸入的內容只包含合法的數據。數據檢查應當在客戶端和服務器端都執行之因此要執行服務器端驗證,是爲了彌補客戶端驗證機制脆弱的安全性。
  • 錯誤消息處理:防範SQL注入,還要避免出現一些詳細的錯誤消息,由於能夠利用這些消息。要使用一種標準的輸入確認機制來驗證全部的輸入數據的長度、類型、語句、企業規則等。
  • 加密處理:在一開始的CDNS例子中沒有加密的數據就直接被利用了,可是加密了就不必定會解密成功,儘可能不要用一些常見的加密算法,就算用也要使用32位以上的加密算法,將用戶登陸名稱、密碼等數據加密保存。加密用戶輸入的數據,而後再將它與數據庫中保存的數據比較,這至關於對用戶輸入的數據進行了「消毒」處理,用戶輸入的數據再也不對數據庫有任何特殊的意義,從而也就防止了注入SQL命令。
  • 存儲過程來執行全部的查詢:SQL參數的傳遞方式將防止利用單引號和連字符實施注入。此外,它還使得數據庫權限能夠限制到只容許特定的存儲過程執行,全部的用戶輸入必須聽從被調用的存儲過程的安全上下文,這樣就很難再發生注入式了。

  SQL注入其實很簡單,別一不留神就被利用了

72.什麼是 XSS 攻擊,如何避免?

  跨站腳本(cross site script)爲了不與樣式css混淆,因此簡稱爲XSS。

  XSS是一種常常出如今web應用中的計算機安全漏洞,也是web中最主流的攻擊方式。那麼什麼是XSS呢?XSS是指惡意攻擊者利用網站沒有對用戶提交數據進行轉義處理或者過濾不足的缺點,進而添加一些代碼,嵌入到web頁面中去。使別的用戶訪問都會執行相應的嵌入代碼。從而盜取用戶資料、利用用戶身份進行某種動做或者對訪問者進行病毒侵害的一種攻擊方式。

  主要緣由:過於信任客戶端提交的數據!

  解決辦法:不信任任何客戶端提交的數據,只要是客戶端提交的數據就應該先進行相應的過濾處理而後方可進行下一步的操做。

  一、將重要的cookie標記爲http only, 這樣的話Javascript 中的document.cookie語句就不能獲取到cookie了.

  二、表單數據規定值的類型,例如:年齡應爲只能爲int、name只能爲字母數字組合。。。。

  四、對數據進行Html Encode 處理

  五、過濾或移除特殊的Html標籤, 例如: <script>, <iframe> , &lt; for <, &gt; for >, &quot for

  六、過濾JavaScript 事件的標籤。例如 "onclick=", "onfocus" 等等。

  xss跨站腳本攻擊

73.什麼是 CSRF 攻擊,如何避免?

  CSRF(Cross-site request forgery),中文名稱:跨站請求僞造,也被稱爲:one click attack/session riding,縮寫爲:CSRF/XSRF。

  你這能夠這麼理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義發送惡意請求。CSRF可以作的事情包括:以你名義發送郵件,發消息,盜取你的帳號,甚至於購買商品,虛擬貨幣轉帳......形成的問題包括:我的隱私泄露以及財產安全。

  下圖簡單闡述了CSRF攻擊的思想:

  

  從上圖能夠看出,要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:

  1.登陸受信任網站A,並在本地生成Cookie。

  2.在不登出A的狀況下,訪問危險網站B。

  CSRF攻擊之因此可以成功,是由於攻擊者能夠僞造用戶的請求,該請求中全部的用戶驗證信息都存在於Cookie中,所以攻擊者能夠在不知道這些驗證信息的狀況下直接利用用戶本身的Cookie來經過安全驗證。由此可知,抵禦CSRF攻擊的關鍵在於:在請求中放入攻擊者所不能僞造的信息,而且該信息不存在於Cookie之中。

  鑑於此,咱們將爲每個表單生成一個隨機數祕鑰,並在服務器端創建一個攔截器來驗證這個token,若是請求中沒有token或者token內容不正確,則認爲多是CSRF攻擊而拒絕該請求。

  CSRF攻擊與防護

  淺談CSRF攻擊方式

相關文章
相關標籤/搜索