Java面試系列11:Web基礎

轉載:
https://blog.csdn.net/qq_38950316/article/details/81087809
很多,不一一列出來,主要是自己總結用的。
有錯歡迎指出。槓精退散。

1.TCP,UDP區別,用途

TCP
	TCP協議是面向連接的通信協議,即傳輸數據之前,
	在發送端和接收端建立邏輯連接,然後再傳輸數據,
	它提供了兩臺計算機之間可靠無差錯的數據傳輸。
	三次握手:
		TCP協議中,在發送數據的準備階段,客戶端與服務器之間的三次交互,以保證連接的可靠。
		第一次握手,客戶端向服務器端發出連接請求,等待服務器確認。
		第二次握手,服務器端向客戶端回送一個響應,通知客戶端收到了連接請求。
		第三次握手,客戶端再次向服務器端發送確認信息,確認連接。
	TCP協議可以保證傳輸數據的安全,所以應用十分廣泛,例如下載文件、瀏覽網頁等。
	四次揮手:
		一、客戶端進程發出連接釋放報文,並且停止發送數據。
		二、服務器收到連接釋放報文,發出確認報文,
		       TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,
		       這時候處於半關閉狀態,即客戶端已經沒有數據要發送了,但是服務器若發送數據,客戶端依然要接受。
		       客戶端收到服務器的確認請求後,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,
		       等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最後的數據)。
		三、服務器將最後的數據發送完畢後,就向客戶端發送連接釋放報文,
		       此時,服務器就進入了LAST-ACK(最後確認)狀態,等待客戶端的確認。
		四、客戶端收到服務器的連接釋放報文後,必須發出確認,
		        注意此時TCP連接還沒有釋放,必須經過2MSL(最長報文段壽命)的時間後,
		        當客戶端撤銷相應的TCB後,才進入CLOSED狀態。
		        服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。
		        結束TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。
	三握四揮:
		https://blog.csdn.net/qq_38950316/article/details/81087809
UDP
	UDP協議是一個面向無連接的協議。
	傳輸數據時,不需要建立連接,不管對方端服務是否啓動,
	直接將數據、數據源和目的地都封裝在數據包中,直接發送。
	每個數據包的大小限制在64k以內。
	它是不可靠協議,因爲無連接,所以傳輸速度快,但是容易丟失數據。
	日常應用中,例如視頻會議、QQ聊天等。
TCP通信分析圖解
	【服務端】啓動,創建ServerSocket對象,等待連接。
		Socket client = new Socket("127.0.0.1", 6666);
		ServerSocket server = new ServerSocket(6666);
	【客戶端】啓動,創建Socket對象,請求連接。
	【服務端】接收連接,調用accept方法,並返回一個Socket對象。
	【客戶端】Socket對象,獲取OutputStream,向服務端寫出數據。
	【服務端】Scoket對象,獲取InputStream,讀取客戶端發送的數據。

2.tcp通過什麼來保證可靠傳輸的

1、應用數據被分割成TCP認爲最適合發送的數據塊。
      這和UDP完全不同,應用程序產生的數據報長度將保持不變。 (將數據截斷爲合理的長度)
2、當TCP發出一個段後,它啓動一個定時器,等待目的端確認收到這個報文段。
      如果不能及時收到一個確認,將重發這個報文段。      (超時重發)
3、當TCP收到發自TCP連接另一端的數據,它將發送一個確認。
      這個確認不是立即發送,通常將推遲幾分之一秒。
      (對於收到的請求,給出確認響應) (之所以推遲,可能是要對包做完整校驗)
4、TCP將保持它首部和數據的檢驗和。
      這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。
  	      如果收到段的檢驗和有差錯,TCP將丟棄這個報文段和不確認收到此報文段。
  	      (希望發端超時並重發) 
  	      (校驗出包有錯,丟棄報文段,不給出響應,TCP發送數據端,超時時會重發數據)
5、既然TCP報文段作爲IP數據報來傳輸,而IP數據報的到達可能會失序,
	因此TCP報文段的到達也可能會失序。
	如果必要,TCP將對收到的數據進行重新排序,
	將收到的數據以正確的順序交給應用層。
	(對失序數據進行重新排序,然後才交給應用層)           
6、既然IP數據報會發生重複,TCP的接收端必須丟棄重複的數據。
	 (對於重複數據,能夠丟棄重複數據)        
7、TCP還能提供流量控制。
	TCP連接的每一方都有固定大小的緩衝空間。
  	      TCP的接收端只允許另一端發送接收端緩衝區所能接納的數據。這將防止較快主機致使較慢主機的緩衝區溢出。 (TCP可以進行流量控制,防止較快主機致使較慢主機的緩衝區溢出)

3.tcp 爲什麼要三次握手,兩次不行嗎?爲什麼?

兩次握手只能保證單向連接是暢通的。

Step1       A -> B : 你好,B。
Step2       A <- B : 收到。你好,A。

這樣的兩次握手過程, A 向 B 打招呼得到了迴應,即 A 向 B 發送數據,B 是可以收到的。
但是 B 向 A 打招呼,A 還沒有迴應,B 沒有收到 A 的反饋,無法確保 A 可以收到 B 發送的數據。
只有經過第三次握手,才能確保雙向都可以接收到對方的發送的 數據。

Step3       A -> B : 收到,B。

這樣 B 才能確定 A 也可以收到 B 發送給 A 的數據。

4.一次URL請求過程

1.DNS域名解析
2.建立TCP連接(三次握手)
3.發送請求–tomcat進行處理
4.四次揮手關閉連接

5. servlet

概念:
運行在服務器端的小程序
Servlet就是一個接口,定義了Java類被瀏覽器訪問到(tomcat識別)的規則。

public class ServletDemo1 implements Servlet
 實現接口中的抽象方法

配置Servlet

	 在web.xml中配置:
    	<!--配置Servlet -->
    	<servlet>
        		<servlet-name>demo1</servlet-name>
        		<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
    	</servlet>

    	<servlet-mapping>
        		<servlet-name>demo1</servlet-name>
        		<url-pattern>/demo1</url-pattern>
    	</servlet-mapping>

執行原理:

	1. 當服務器接受到客戶端瀏覽器的請求後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑
	2. 查找web.xml文件,是否有對應的<url-pattern>標籤體內容。
	3. 如果有,則在找到對應的<servlet-class>全類名
	4. tomcat會將字節碼文件加載進內存,並且創建其對象
	5. 調用其方法
Servlet中的生命週期方法:
	1. 被創建:執行init方法,只執行一次
		Servlet什麼時候被創建?
			默認情況下,第一次被訪問時,Servlet被創建
		第一次被訪問時,創建
            				<load-on-startup>的值爲負數
	            	在服務器啓動時,創建
	                		<load-on-startup>的值爲0或正整數
		Servlet的init方法,只執行一次,說明一個Servlet在內存中只存在一個對象,Servlet是單例的
	2. 提供服務:執行service方法,執行多次
		每次訪問Servlet時,Service方法都會被調用一次。
	3. 被銷燬:執行destroy方法,只執行一次
		Servlet被銷燬時執行。服務器關閉時,Servlet被銷燬.
		只有服務器正常關閉時,纔會執行destroy方法。
		destroy方法在Servlet被銷燬之前執行,一般用於釋放資源
Servlet3.0:
	支持註解配置。可以不需要web.xml了。

6、get提交和post提交有何區別

(1)get一般用於從服務器上獲取數據,
     post一般用於向服務器傳送數據
(2)請求的時候參數的位置有區別,
          get的參數是拼接在url後面,用戶在瀏覽器地址欄可以看到。
          post是放在http包的包體中。

比如說用戶註冊,你不能把用戶提交的註冊信息用get的方式吧,
那不是說把用戶的註冊信息都顯示在Url上了嗎,是不安全的。

(3)能提交的數據有區別,
         get方式能提交的數據只能是文本,且大小不超過1024個字節,
         而post不僅可以提交文本還有二進制文件。
         所以說想上傳文件的話,那我們就需要使用post請求方式
(4)servlet在處理請求的時候分別對應使用doGet和doPost方式進行處理請求

7、JSP與Servlet有什麼區別

Servlet是服務器端的程序,動態生成html頁面發送到客戶端,
但是這樣程序裏會有很多out.println(),java與html語言混在一起,很亂,
所以後來sun公司推出了JSP.
其實JSP就是Servlet,每次運行的時候JSP都首先被編譯成servlet文件,
然後再被編譯成.class文件運行。
有了jsp,在MVC項目中servlet不再負責動態生成頁面,
轉而去負責控制程序邏輯的作用,控制jsp與javabean之間的流轉。

8、doGet與doPost方法的兩個參數是什麼

HttpServletRequest:封裝了與請求相關的信息
HttpServletResponse:封裝了與響應相關的信息

9、request.getAttribute()和request.getParameter

(1)有setAttribute,沒有setParameter方法
(2)getParameter獲取到的值只能是字符串,不可以是對象,
         而getAttribute獲取到的值是Object類型的。
(3)通過form表單或者url來向另一個頁面或者servlet傳遞參數的時候需要用getParameter獲取值;getAttribute只能獲取setAttribute的值
(4)setAttribute是應用服務器把這個對象放到該頁面所對應的一塊內存當中,
    當你的頁面服務器重定向到另一個頁面的時候,
	應用服務器會把這塊內存拷貝到另一個頁面對應的內存當中。
    通過getAttribute可以取得你存下的值,當然這種方法可以用來傳對象。
    用session也是一樣的道理,這是說request和session的生命週期不一樣而已。

10、JSP有哪些內置對象,作用是什麼?

名稱				作用
request	包含用戶端請求的信息
response	包含服務器傳回客戶端的響應信息
session	與請求有關的會話期
pageContext	管理網頁屬性
application	服務器啓動時創建,服務器關閉時停止,爲多個應用程序保存信息
out	向客戶端輸出數據
config	servlet的架構部件
page	指網頁本身
exception	針對錯誤頁面纔可使用

11、四種會話跟蹤技術作用域

(1)page:一個頁面
(2)request::一次請求
(3)session:一次會話
(4)application:服務器從啓動到停止。

12、forward和redirect的區別

(1)從地址欄顯示來說 
	forward是服務器請求資源,服務器直接訪問目標地址的URL,
	把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器.
	瀏覽器根本不知道服務器發送的內容從哪裏來的,
	所以它的地址欄還是原來的地址.
	redirect是服務端根據邏輯,發送一個狀態碼,
	告訴瀏覽器重新去請求那個地址.所以地址欄顯示的是新的URL.
(2)從數據共享來說 
	forward:轉發頁面和轉發到的頁面可以共享request裏面的數據.
	redirect:不能共享數據.
(3)從運用地方來說 
	forward:一般用於用戶登陸的時候,根據角色轉發到相應的模塊.
	redirect:一般用於用戶註銷登陸時返回主頁面和跳轉到其它的網站等.
(4)從效率來說 
	forward:高.
	redirect:低.

13.cookie和session的區別

Cookie:
客戶端會話技術,將數據保存到客戶端

	1. 創建Cookie對象,綁定數據
		* new Cookie(String name, String value) 
	2. 發送Cookie對象
		* response.addCookie(Cookie cookie) 
	3. 獲取Cookie,拿到數據
		* Cookie[]  request.getCookies()  

實現原理
基於響應頭set-cookie和請求頭cookie實現

1. 一次可不可以發送多個cookie?
	* 可以
	* 可以創建多個Cookie對象,使用response調用多次addCookie方法發送cookie即可。
2. cookie在瀏覽器中保存多長時間?
	1. 默認情況下,當瀏覽器關閉後,Cookie數據被銷燬
	2. 持久化存儲:
		* setMaxAge(int seconds)
			1. 正數:將Cookie數據寫到硬盤的文件中。持久化存儲。並指定cookie存活時間,時間到後,cookie文件自動失效
			2. 負數:默認值
			3. 零:刪除cookie信息
3. cookie能不能存中文?
	* 在tomcat 8 之前 cookie中不能直接存儲中文數據。
		* 需要將中文數據轉碼---一般採用URL編碼(%E3)
	* 在tomcat 8 之後,cookie支持中文數據。特殊字符還是不支持,建議使用URL編碼存儲,URL解碼解析
4. cookie共享問題?
	1. 假設在一個tomcat服務器中,部署了多個web項目,那麼在這些web項目中cookie能不能共享?
		* 默認情況下cookie不能共享
		* setPath(String path):設置cookie的獲取範圍。默認情況下,設置當前的虛擬目錄
			* 如果要共享,則可以將path設置爲"/"
			cookie.setPath("/");
	2. 不同的tomcat服務器間cookie共享問題?
		* setDomain(String path):如果設置一級域名相同,那麼多個服務器之間cookie可以共享
			* setDomain(".baidu.com"),那麼tieba.baidu.com和news.baidu.com中cookie可以共享

Cookie的特點和作用

1. cookie存儲數據在客戶端瀏覽器
2. 瀏覽器對於單個cookie 的大小有限制(4kb)
3. 對同一個域名下的總cookie數量也有限制(20個)
* 作用:
	1. cookie一般用於存出少量的不太敏感的數據
	2. 在不登錄的情況下,完成服務器對客戶端的身份識別

Session:
服務器端會話技術,在一次會話的多次請求間共享數據,
將數據保存在服務器端的對象中。

1. 獲取HttpSession對象:
	HttpSession session = request.getSession();
2. 使用HttpSession對象:
	Object getAttribute(String name)  
	void setAttribute(String name, Object value)
	void removeAttribute(String name)  

Session的實現是依賴於Cookie的。

1. 當客戶端關閉後,服務器不關閉,兩次獲取session是否爲同一個?
	* 默認情況下。不是。
	* 如果需要相同,則可以創建Cookie,鍵爲JSESSIONID,設置最大存活時間,讓cookie持久化保存。
		 Cookie c = new Cookie("JSESSIONID",session.getId());
         c.setMaxAge(60*60);
         response.addCookie(c);
2. 客戶端不關閉,服務器關閉後,兩次獲取的session是同一個嗎?
	* 不是同一個,但是要確保數據不丟失。tomcat自動完成以下工作
		* session的鈍化:
			* 在服務器正常關閉之前,將session對象系列化到硬盤上
		* session的活化:
			* 在服務器啓動後,將session文件轉化爲內存中的session對象即可。
3. session什麼時候被銷燬?
	1. 服務器關閉
	2. session對象調用invalidate() 。
	3. session默認失效時間 30分鐘
		選擇性配置修改	
		<session-config>
	        <session-timeout>30</session-timeout>
	    </session-config>

session的特點

 1. session用於存儲一次會話的多次請求的數據,存在服務器端
 2. session可以存儲任意類型,任意大小的數據

session與Cookie的區別:

	1. session存儲數據在服務器端,Cookie在客戶端
	2. session沒有數據大小限制,Cookie有
	3. session數據安全,Cookie相對於不安全

14、SpringMVC通過註解的方式允許跨域

在Controller類或其方法上加@CrossOrigin註解,來使之支持跨域。
@CrossOrigin(origins = “*”, maxAge = 3600)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章