?歡迎訂閱《大廠面試突擊》專欄,面試10多家大廠總結出的高頻面試知識,免費階段大家趕快訂閱
?更多精品專欄簡介點這里
?更多大廠全路線學習視頻+筆記,PC端看左側「關于作者」,手機端「私信」博主,
?老規矩,私信前請先關注,不然無法回復大家,感謝支持!
幸福,不是長生不老,不是大魚大肉,不是權傾朝野,幸福是每一個微小的生活愿望達成,當你想吃的時候有得吃,想被愛的時候有人來愛你,
前言
哈嘍,大家好,我是一條,
告訴大家一個訊息,我在7月份又離職了,離職后我開始瘋狂的面試,一共面了百度、位元組、滴滴、美團、陌陌、58同城、汽車之家、元氣森林、猿輔導,掌閱科技,美術寶、moka等10多家中大廠,最多的時候一天4面,

面完之后我發現大廠對于演算法的重視程度非常之高,演算法題沒做出來,基本就不會再往下問了,你“八股文”再溜也沒有展現的機會,
所以我開始刷leetcode,每天一道,放在了《leetcode》專欄里,趁著還沒有收費,大家可以抓緊訂閱一波,
但演算法非一日之功可成,我們的“八股文”也不能落下,
一條根據多家公司的面試檢驗,將高頻面試題分門別類的總結出來,包括java基礎篇、javaweb篇、集合篇、jvm篇、多執行緒篇、框架篇、設計模式篇、資料結構篇、網路篇、作業系統篇、mysql篇、redis篇、kafka篇、ES篇、dubbo篇,Spring cloud篇、企業專案篇,由淺入深,到時有可能還會增加,
所有文章都會放在《大廠面試突擊》專欄里,以后會收費,所以請大家現在抓緊訂閱,
本文是??javaWeb篇??
java Web是用Java技術來解決相關web互聯網領域的技術堆疊,Web就是網頁,分為靜態和動態,涉及 的知識點主要包括jsp,servlet,tomcat,http,MVC等知識,由于jsp更偏向前端,本文不做講解,
本文特別之處
現在網路的面試題資源可以說數不勝數,但也良莠不齊,
那么,博主總結的有哪些特別之處呢?
選題
以戰養戰
相比于逐個知識點的去講解,一條更偏向于用面試題的方式呈現,原因如下:
- 節省時間,有很多朋友都是面試前臨時抱佛腳,從
helloworld開始講,根本來不及好嗎 - 重點突出,有些東西面試官是不會問的,也沒法問,暫時就可以不看
- 轉換思維,最重要的一點,有很多時候這個東西你知道,但一問就不會,有沒有,有的評論區扣1
經驗之談
關于選題,java的知識點又多又雜,技術更新又很快,所以明白以下幾點很重要:
-
很多技術已經淘汰,所以就沒必要再去看,
-
有些技術是當下正火,面試官特別愛問,
-
有些知識點之間存在關聯關系,問完這個必問那個,
一條憑借面試了10多家大廠的經驗總結最高頻的知識點,讓你不做無用功,事半功倍!
解答
- 文章中大部分題目都是在面試中真實被問到的,會標明出處,
- 對知識點的講解都盡量簡單,用生活中的小事舉例說明,
- 除了知識點講解,還會說明這道題的考點是哪,怎么回答更加分,
- 會從一道題延伸出多道題,理清關聯關系,題目的順序都是精心排列,由淺入深,
題目合集
文章目錄
- 前言
- 本文特別之處
- 選題
- 以戰養戰
- 經驗之談
- 解答
- 題目合集
- HTTP網路請求方式有哪些?
- GET和POST有什么區別?
- 什么是冪等性?
- 如何保證冪等性?
- insert前select
- 加鎖
- 唯一索引
- Token
- 常見的網路狀態碼有哪些?
- 1xx(資訊性狀態碼)
- 2xx(成功狀態碼)
- 3xx(重定向狀態碼)
- 301和302的區別?
- 4xx(客戶端錯誤狀態碼)
- 5xx(服務器錯誤狀態碼)
- 轉發和重定向有什么區別?
- 轉發
- 重定向
- 什么是跨域?如何解決跨域問題?
- 什么是跨域?
- 解決方案
- 什么是ajax?
- 什么是Servlet
- 說一說Servlet的生命周期
- 比較一下Listener和Filter/Servlet的區別
- 攔截器和過濾器的區別
- Jsp有哪些內置物件?作用分別是什么?
- jsp和servlet的區別、共同點、各自應用的范圍?
- tomcat容器是如何創建servlet類實體?用到了什么原理?
- 如何解決請求和回應的亂碼問題
- 請求
- 回應
- session、cookie、token都是什么?
- MVC與三層架構
- MVC
- 三層架構
- 說說你對JSON的理解
- 介面間基于JSON傳輸資料有什么好處?
- 什么是單點登錄
- 在單點登錄中,如果cookie被禁用了怎么辦?
- 最后
HTTP網路請求方式有哪些?
出自moka、美術寶
相信這個問題都難不倒大家,但很多人答不全,
如果能回答出應用場景就完美了,
GET:最常用的方式,用來向服務器請求資料,沒有請求體,請求引數放在URL后面,POST:用于向表單提交資料,傳送的資料放在請求體中,PUT:用來向服務器上傳檔案,一般對應修改操作,POST用于向服務器發送資料,PUT用于向服務器儲存資料,沒有驗證機制,任何人都可以操作,存在安全問題,具有冪等性,DELETE:用于洗掉服務器上的檔案,具有冪等性,同樣存在安全問題,HEAD:用HEAD進行請求服務器時,服務器只回傳回應頭,不回傳回應體,與GET一樣沒有請求體,常用于檢查請求的URL是否有效,PATCH:對資源進行部分修改,與PUT區別在于,PUT是修改所有資源,替代它,而PATCH只是修改部分資源,TRACE:用來查看一個請求,經過網關,代理到達服務器,最后請求的變換,因安全問題被禁用,OPTIONS:當客戶端不清楚對資源操作的方法,可以使用這個,具有冪等性,
GET和POST有什么區別?
高頻必考題
- 作用不同:GET 用于獲取資源,而 POST 用于傳輸物體主體,
- 引數位置不一樣: GET 的引數是以查詢字串出現在 URL 中,而 POST 的引數存盤在物體主體中,雖然GET的引數暴露在外面,但可以通過加密的方式處理,而 POST 引數即使存盤在物體主體中,我們也可以通過一些抓包工具如(Fiddler)查看,
- 冪等性:GET是冪等性,而POST不是冪等性,(面試官緊接著可能就會問你什么是冪等性?如何保證冪等性?)
- 安全性:安全的 HTTP 方法不會改變服務器狀態,也就是說它只是可讀的, GET 方法是安全的,而 POST 卻不是,因為 POST 的目的是傳送物體主體內容,這個內容可能是用戶上傳的表單資料,上傳成功之后,服務器可能把這個資料存盤到資料庫中,因此狀態也就發生了改變,
什么是冪等性?
是否具有冪等性也是一個http請求的重要關注點,
冪等性:指的是同樣的請求不管執行多少次,效果都是一樣,服務器狀態也是一樣的,具有冪等性的請求方法沒有副作用,(統計用途除外)
如何保證冪等性?
假設這樣一個場景:有時我們在填寫某些
form表單時,保存按鈕不小心快速點了兩次,表中竟然產生了兩條重復的資料,只是id不一樣,這是一個比較常見的冪等性問題,在高并發場景下會變得更加復雜,那怎么保證介面的冪等性呢?
insert前select
插入資料前先根據某一欄位查詢一下資料庫,如果已經存在就修改,不存在再插入,
加鎖
加鎖可解決一切問題,但也要考慮并發性,
主要包括悲觀鎖,樂觀鎖,分布式鎖,
悲觀鎖的并發性較低,更適合使用在防止資料重復的場景,注意冪等性不光是防止重復還需要結果相同,
樂觀鎖可以很高的提升性能,也就是常說的版本號,
分布式鎖應用在高并發場景,主要用redis來實作,
唯一索引
通過資料庫的唯一索引來保證結果的一致性和資料的不重復,
Token
兩次請求,第一請求拿到token,第二次帶著token去完成業務請求,
常見的網路狀態碼有哪些?
出自美術寶
此題考查的是你有沒有實際解決bug的經驗和能力,不知道對應網路狀態碼的含義,解決問題的能力就會受到懷疑,
應該重點關注同一系列之間的區別,比如504和505什么區別?
網路狀態碼共三位數字組成,根據第一個數字可分為以下幾個系列:
1xx(資訊性狀態碼)
代表請求已被接受,需要繼續處理,
包括:100、101、102
這一系列的在實際開發中基本不會遇到,可以略過,
2xx(成功狀態碼)
表示成功處理了請求的狀態代碼,
200:請求成功,表明服務器成功了處理請求,
202:服務器已接受請求,但尚未處理,
204:服務器成功處理了請求,但沒有回傳任何內容,
206:服務器成功處理了部分 GET 請求,
3xx(重定向狀態碼)
300:針對請求,服務器可執行多種操作,
301:永久重定向
302:臨時性重定向
303:303與302狀態碼有著相同的功能,但303狀態碼明確表示客戶端應當采用GET方法獲取資源,
301和302的區別?
301比較常用的場景是使用域名跳轉,比如,我們訪問 http://www.baidu.com 會跳轉到https://www.baidu.com,發送請求之后,就會回傳301狀態碼,然后回傳一個location,提示新的地址,瀏覽器就會拿著這個新的地址去訪問,
302用來做臨時跳轉比如未登陸的用戶訪問用戶中心重定向到登錄頁面,
4xx(客戶端錯誤狀態碼)
400:該狀態碼表示請求報文中存在語法錯誤,但瀏覽器會像200 OK一樣對待該狀態碼,
401:表示發送的請求需要有通過HTTP認證的認證資訊,比如token失效就會出現這個問題,
403:被拒絕,表明對請求資源的訪問被服務器拒絕了,
404:找不到,表明服務器上無法找到請求的資源,也可能是拒絕請求但不想說明理由,
5xx(服務器錯誤狀態碼)
500:服務器本身發生錯誤,可能是Web應用存在的bug或某些臨時的故障,
502:該狀態碼表明服務器暫時處于超負載或正在進行停機維護,現在無法處理請求,
??有時候回傳的狀態碼回應是錯誤的,比如Web應用程式內部發生錯誤,狀態碼依然回傳200
轉發和重定向有什么區別?
上面提到了重定向,那你知道什么是轉發嗎?
轉發
A找B借錢,B沒有錢,B去問C,C有錢,C把錢借給A的程序,
客戶瀏覽器發送http請求,web服務器接受此請求,呼叫內部的一個方法在容器內部完成請求處理和轉發動作,將目標資源發送給客戶,
整個轉發一個請求,一個回應,地址欄不會發生變化,不能跨域訪問,
重定向
A找B借錢,B沒有錢,B讓A去找C,A又和C借錢,C有錢,C把錢借給A的程序,
客戶瀏覽器發送http請求,web服務器接受后發送302狀態碼回應及對應新的location給客戶瀏覽器,客戶瀏覽器發現是302回應,則自動再發送一個新的http請求,請求url是新的location地址,服務器根據此請求尋找資源并發送給客戶,
兩個請求,兩個回應,可以跨域,
什么是跨域?如何解決跨域問題?
出自moka
考查實際開發中解決問題的能力,
什么是跨域?
跨域是針對瀏覽器的,由于瀏覽器的同源策略不能執行其他網站的腳本,那什么是同源?
同源是指域名、協議、埠均相同,只要有一個不同,就是跨域,
解決方案
- JSONP跨域:人們發現呼叫js檔案是不受跨域影響的,所以通過把資料裝進JS來解決跨域問題,JSONP是一段引數是json格式(大多數情況)的JS代碼,
- nginx反向代理
- HEADERS:通過修改
headers的Access-Control-Allow-Origin允許所有人訪問,
還有其他解決方案,但不常用,實際開發都是基于
springboot注解實作,
什么是ajax?
一種「異步請求」+「區域重繪」技術,等于異步JavaScript 和 XML,用于創建快速動態網頁,
異步請求:不需要等待當前請求回傳就可以發送下一個請求,
區域重繪:無需重新加載整個網頁的情況下,能夠更新部分網頁,
什么是Servlet
servlet是一個比較抽獎的概念,也是web部分的核心組件,大家回答這個問題一定要加入自己的理解,不要背定義,
servlet其實就是一個java程式,他主要是用來解決動態頁面的問題,
之前都是瀏覽器像服務器請求資源,服務器(tomcat)回傳頁面,但用戶多了之后,每個用戶希望帶到不用的資源,這時就該servlet上場表演了,
servlet存在于tomcat之中,用來網路請求與回應,但他的重心更在于業務處理,我們訪問京東和淘寶的回傳的商品是不一樣的,就需要程式員去撰寫,目前MVC三層架構,我們都是在service層處理業務,但這其實是從servlet中抽取出來的,
看一下servlet處理請求的程序:

說一說Servlet的生命周期
Servlet生命周期分為三個階段:
-
初始化階段 呼叫init()方法
-
回應客戶請求階段 呼叫service()方法-àdoGet/doPost()
-
終止階段 呼叫destroy()方法
比較一下Listener和Filter/Servlet的區別
servlet已經介紹過,和他相似的這些你了解嗎?
-
servlet是一種運行服務器端的java應用程式,作業在客戶端請求與服務器回應的中間層,
-
filter是一個可以復用的代碼片段,可以用來轉換HTTP請求、回應和頭資訊,Filter不像Servlet,它不能產生一個請求或者回應,它只是修改對某一資源的請求,或者修改從某一的回應,
-
從字面上可以看出listener主要用來監聽只用,通過listener可以監聽web服務器中某一個執行動作,并根據其要求作出相應的回應,
-
servlet,filter都是針對url之類的,而listener是針對物件的操作的,
攔截器和過濾器的區別
這塊的東西比較亂,給大家畫個圖
- 攔截器是基于java的反射機制的,而過濾器是基于函式回呼,
- 攔截器不依賴與servlet容器,過濾器依賴與servlet容器,
- 攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用,
- 攔截器可以訪問action背景關系、值堆疊里的物件,而過濾器不能訪問,
- 在action的生命周期中,攔截器可以多次被呼叫,而過濾器只能在容器初始化時被呼叫一次,
- 攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可以呼叫業務邏輯,

Jsp有哪些內置物件?作用分別是什么?
- request 用戶端請求,此請求會包含來自GET/POST請求的引數
- response 網頁傳回用戶端的回應
- pageContext 網頁的屬性是在這里管理
- session 與請求有關的會話期
- application servlet 正在執行的內容
- out 用來傳送回應的輸出
- config servlet的構架部件
- page JSP網頁本身
- exception 針對錯誤網頁,未捕捉的例外
jsp和servlet的區別、共同點、各自應用的范圍?
JSP是Servlet技術的擴展,本質上就是Servlet的簡易方式,JSP編譯后是“類servlet”,
Servlet和JSP最主要的不同點在于:Servlet的應用邏輯是在Java檔案中,并且完全從表示層中的HTML里分離開來,而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的檔案,
JSP側重于視圖,Servlet主要用于控制邏輯,在struts框架中,JSP位于MVC設計模式的視圖層,而Servlet位于控制層.
tomcat容器是如何創建servlet類實體?用到了什么原理?
當容器啟動時,會讀取在webapps目錄下所有的web應用中的web.xml檔案,然后對xml檔案進行決議,并讀取servlet注冊資訊,
然后,將每個應用中注冊的servlet類都進行加載,并通過反射的方式實體化,(有時候也是在第一次請求時實體化)
在servlet注冊時加上1如果為正數,則在一開始就實體化,如果不寫或為負數,則第一次請求實體化,
如何解決請求和回應的亂碼問題
請求
GET請求:GET請求引數是在地址后面的,我們需要修改tomcat的組態檔,需要在server.xml檔案修改Connector標簽,添加URIEncoding="utf-8"屬性,
POST請求:post請求提交了中文的請求體,服務器決議出現問題,在獲取引數值之前,設定請求的解碼格式,使其和頁面保持一致,
request.setCharacterEncoding("utf-8");
回應
向瀏覽器發送回應的時候,要告訴瀏覽器,我使用的字符集是哪個,瀏覽器就會按照這種方式來解碼,
方法一:
response.setHeader("Content-Type", "text/html;charset=utf-8");
方法二:
response.setContentType("text/html;charset=utf-8");
session、cookie、token都是什么?
首先我們要明白HTTP是一種無狀態協議,怎么理解呢?很簡單
夏洛:大爺,樓上322住的是馬冬梅家吧?
大爺:馬冬什么?
夏洛:馬冬梅,
大爺:什么冬梅啊?
夏洛:馬冬梅啊,
大爺:馬什么梅?
夏洛:行,大爺你先涼快著吧,
這段對話都熟悉吧,HTTP就是那個大爺,那如果我們就直接把“大爺”放給用戶,用戶不用干別的了,就不停的登錄就行了,
既然“大爺不靠譜”,我們找“大娘”去吧,
哈哈哈,開個玩笑,言歸正傳,
為了解決用戶頻繁登錄的問題,在服務端和客戶端共同維護一個狀態——會話,就是所謂session,我們根據會話id判斷是否是同一用戶,這樣用戶就開心了,
但是服務器可不開心了,因為用戶越來越多,都要把session存在服務器,這對服務器來說是一個巨大的開銷,這是服務器就找來了自己的兄弟幫他分擔(集群部署,負載均衡),
但是問題依然存在,如果兄弟掛了怎么辦,兄弟們之間的資料怎么同步,用戶1把session存放在機器A上,下次訪問時負載均衡到了機器B,完了,找不到,用戶又要罵娘,
這時有人思考,為什么一定要服務端保存呢,讓客戶端自己保存不就好了,所以就誕生了cookie,下一次請求時客戶段把cookie發送給服務器,說我已經登錄了,
但是空口無憑,服務器怎么知道哪個cookie是我發過去的呢?如何驗證成了新的問題,
有人想到了一個辦法,用加密令牌,也就是token,服務器發給客戶端一個令牌,令牌保存加密后id和密鑰,下一次請求時通過headers傳給服務端,由于密鑰別人不知道,只有服務端知道,就實作了驗證,且別人無法偽造,
如果感覺博主講的還不錯,一鍵三連支持一下吧,
更多學習視頻+筆記,PC端看左側「關于作者」,手機端「私信」博主,
MVC與三層架構
三層架構與MVC的目標一致:都是為了解耦和、提高代碼復用,MVC是一種設計模式,而三層架構是一種軟體架構,
MVC
Model 模型
模型負責各個功能的實作(如登錄、增加、洗掉功能),用JavaBean實作,
View 視圖
用戶看到的頁面和與用戶的互動,包含各種表單, 實作視圖用到的技術有html/css/jsp/js等前端技術,
常用的web 容器和開發工具
Controller 控制器
控制器負責將視圖與模型一一對應起來,相當于一個模型分發器,接收請求,并將該請求跳轉(轉發,重定向)到模型進行處理,模型處理完畢后,再通過控制器,回傳給視圖中的請求處,
三層架構
表現層(UI)(web層)、業務邏輯層(BLL)(service層)、資料訪問層(DAL)(dao層) ,再加上物體類別庫(Model)
-
物體類別庫(Model),在Java中,往往將其稱為Entity物體類,資料庫中用于存放資料,而我們通常選擇會用一個專門的類來抽象出資料表的結構,類的屬性就一對一的對應這表的屬性,一般來說,Model物體類別庫層需要被DAL層,BIL層和UI層參考,
-
資料訪問層(DAL),主要是存放對資料類的訪問,即對資料庫的添加、洗掉、修改、更新等基本操作,DAL就是根據業務需求,構造SQL陳述句,構造引數,呼叫幫助類,獲取結果,DAL層被BIL層呼叫
-
業務邏輯層(BLL),BLL層好比是橋梁,將UI表示層與DAL資料訪問層之間聯系起來,所要負責的,就是處理涉及業務邏輯相關的問題,比如在呼叫訪問資料庫之前,先處理資料、判斷資料,
說說你對JSON的理解
JSON是一種輕量級的資料交換格式,它基于標準字串實作,可分為三類資料:
-
單個資料:有number, string, boolean和null四種型別資料,
-
多個有序的資料: 陣列,用[]包含起來, 其元素可以是三類資料中的任意一種, 元素之間用,號隔開,
-
多個無序的資料: 物件用{}包含起來, 其元素必須由key-value組成, key是一個字串, value可以是任意型別資料, key與value之間用:號隔開, 兩個key-value之間用,號隔開,
介面間基于JSON傳輸資料有什么好處?
json之前都是基于
xml的傳輸,所以基于xml對比,
- 簡潔,沒有xml的開閉標簽
- 檔案更小,傳輸更快
- 序列化和反序列化的速度高于xml
- cpu處理json消耗的資源更少
什么是單點登錄
單點登錄的英文名叫做:Single Sign On(簡稱SSO),
起初我們的所有功能都在一個系統,比如登錄,交易,物理,后來有了分布式微服務,按照功能拆分成了多個子服務,那如何實作一處登錄,處處可用呢?
也就是如何用一把鎖,打開你家的所有門?需要解決以下問題:
session共享
- 全域復制,集群內每個tomcat的session完全同步,這樣會影響集群的性能,
- hash映射,將ip映射的對應的機器上,也就是某個固定訪問某臺機器,一旦掛了,就會丟資料,
- 把Session資料放在Redis中,
redis會在【redis篇】更新,想提前了解的小伙伴PC端看左側「關于作者」,手機端「私信」博主,
在單點登錄中,如果cookie被禁用了怎么辦?
單點登錄的原理是后端生成一個sessionID,然后設定到cookie,后面的所有請求瀏覽器都會帶上cookie,然后服務端從cookie里獲取sessionID,再查詢到用戶資訊,
所以,保持登錄的關鍵是通過cookie保存和傳輸的sessionID,其本質是能獲取用戶資訊的資料,除了cookie,還通常使用HTTP請求頭來傳輸,但是這個請求頭瀏覽器不會像cookie一樣自動攜帶,需要手工處理,
以上就是關于「Javaweb」部分總結出的面試題,如果哪里有問題,歡迎大家交流評論!
最后
?今天是堅持刷題更文的第34/100天
?各位的點贊、關注、收藏、評論、訂閱就是一條創作的最大動力
?更多面試題歡迎關注專欄《大廠面試突擊》
為了回饋各位粉絲,禮尚往來,給大家準備了一條多年積累下來的優質資源,包括 學習視頻、面試資料、珍藏電子書等
需要的小伙伴PC端看左側「關于作者」,手機端「私信」博主,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/294933.html
標籤:java
