廣發銀行 java面試

收錄一些印象比較深刻的問題

1.不用session和cookie 怎麼實現半小時內自動登錄

JS端的localStorage:HTML5提供的本地存儲方式(可以稱爲“鍵值對”數據庫)

https://www.jb51.net/article/96092.htm

或者更好的選擇-token

Token

解決問題:服務器上存儲所有用戶的seesion id 導致服務器壓力大 和 集中存儲session id 可能導致丟失單點失敗 的問題

 Header + userID + 加密算法(SHA-256)+服務器自己的密鑰——簽名——附在信息上

服務器接收到請求時 用算法和密鑰 再對Header 和 userID 進行 加密 和 密鑰

看服務器生成的 簽名 和 發送過來信息中的簽名是否一樣,一樣則爲已經登陸過

https://www.cnblogs.com/moyand/p/9047978.html

tokens 是多用戶下處理認證的最佳方式。

tokens特性:

     1.無狀態、可擴展

     2.支持移動設備

     3.跨程序調用

     4.安全

基於Token的身份驗證的過程如下:

    1.用戶通過用戶名和密碼發送請求。

    2.程序驗證。

    3.程序返回一個簽名的token 給客戶端。

    4.客戶端儲存token,並且每次用於每次發送請求。

    5.服務端利用過濾器驗證token並返回數據。

 

2.分角色登陸

我的回答是:登陸判斷用戶權限,在Controller 中按權限跳轉到相應的頁面,並且頁面放在WEB-INF中,不允許別人直接訪問

其實可以用spring-security

https://blog.csdn.net/liushangzaibeijing/article/details/81220610

https://blog.csdn.net/larger5/article/details/81047869

——依賴着一系列servlet filter來提供不同的安全特性

——基於Spring的企業應用系統提供聲明式的安全訪問控制解決方式的安全框架

 

3.攔截器和過濾器的區別

都體現了AOP思想,都能實現權限檢查、日誌記錄

攔截器 過濾器
依賴於spring容器 依賴於servlet容器
Web application swing程序中都可以 只能用在Web程序中
實現上基於Java的反射機制,屬於面向切面編程(AOP)的一種運用 基於函數回調,可以對幾乎所有請求進行過濾
一個攔截器實例在一個controller生命週期之內可以多次調用,但只能對controller請求進行攔截 一個過濾器實例只能在容器初始化時調用一次
可以深入到方法前後、異常拋出前後 只在Servlet前後
可以訪問action上下文、值棧裏的對象 不可以
可以獲取IOC容器中的各個bean 不可以

https://blog.csdn.net/xiaoyaotan_111/article/details/53817918

https://blog.csdn.net/chenleixing/article/details/44573495

 

4.分佈式鎖

分佈式,多臺計算機合作,處理不同的部分

(對應,集羣就是多臺做同樣的事情;部署在不同服務器上的同一個子系統應做負載均衡)

https://blog.csdn.net/jiangyu1013/article/details/80417961

在分佈式系統中,大家不是在一個JVM裏了,不可能用synchronized來在多個子系統之間實現鎖

(線程間對資源進行鎖——synchronized/lock,而分佈式系統中是屬於進程之間共享的資源)

 

分佈式鎖,是指在分佈式的部署環境下,通過鎖機制來讓多客戶端互斥的對共享資源進行訪問

分佈式鎖實現:Memcached、Redis、Zookeeper

樂觀鎖——引入版本號來實現

悲觀鎖——排它鎖——InnoDB引擎 + 有索引的字段——行級鎖

 

5.WebSocket

https://www.runoob.com/html/html5-websocket.html

WebSocket 是 HTML5 開始提供的一種在單個 TCP 連接上進行全雙工通訊的應用層協議。

因此寫在js上

瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,並進行雙向數據傳輸。

——HTTP請求可能包含較長的頭部,其中真正有效的數據可能只是很小的一部分

——能更好的節省服務器資源和帶寬,並且能夠更實時地進行通訊

請求頭部:Upgrade: websocket——升級到websocket協議

服務器返回101——協議升級完成,後續的數據交互都按照新的協議來

數據以幀形式傳送

https://www.jianshu.com/p/a5aee2cfe6d4

 

6.前後端分離

核心思想是前端HTML頁面通過AJAX調用後端的RESTFUL API接口並使用JSON數據進行交互

 

未分離時代(各種耦合):

MVC框架(我直接就答了MVC框架....),JSP+Servlet形式

——前端不可避免遇到後端的代碼——例如<% java代碼%>的形式

——JSP中嵌入了java後端的代碼

問題:

開發過程的前後端互相矛盾

(可以理解爲學校項目大多都是這種——所有學校的項目大多都是學生負責某一模塊的前端後端

——而不是前後端分離這樣的形式進行小組合作)

 

半分離時代:

前端負責開發頁面,通過接口(Ajax)獲取數據,採用Dom操作對頁面進行數據綁定,最終是由前端把頁面渲染出來。

這也就是Ajax與SPA應用(單頁應用)結合的方式。

步驟如下:
(1)瀏覽器請求,CDN返回HTML頁面;
(2)HTML中的JS代碼以Ajax方式請求後臺的Restful接口;
(3)接口返回Json數據,頁面解析Json數據,通過Dom操作渲染頁面;

【Restful接口:

每個資源都有一個唯一的資源標識符 & 對資源的各種操作不會改變資源標識符

——http://127.0.0.1/user 同一個url 但是可以對應 增刪改查操作 

區別在於http方式——GET POST PUT DELETE

spring-mvc 中 @RequestMapping(method = RequestMethod.POST)

https://www.jianshu.com/p/7893169a7c93

半分離原因:

前後端需要協商ajax的數據——同步輸出 or 異步json渲染

特點:

前端不會嵌入任何後臺代碼,前端專注於HTML、CSS、JS的開發,不依賴於後端,自己還能夠模擬Json數據來渲染頁面,發現Bug。

缺點:

js冗餘,頁面渲染複雜且緩慢,甚至卡頓

業務複雜的話,一個頁面可能需要多次請求才能完成頁面的渲染——PC端可以,但移動端可以嗎?

——需要前後端分離

 

分離:

上面提到的SPA可以算是分離——但SPA實際中很少見

我們需要

  • 前端負責view和controller層
  • 後端只負責model層,業務處理與數據持久化等

問題來了——前端咋懂Controller層呀——node.js

node.js適合運用在高併發、I/O密集、少量業務邏輯的場景。

——NodeJs的作用在MVC中相當於C(控制器)

爲什麼用將nodejs當做是前後端的橋樑?

後端的數據,前端不能直接使用;前端因爲排序、篩選和頁面展示的需求 要對數據進行二次處理。

處理放在前端的話 會浪費瀏覽器性能——因此交給nodejs 這個中間層

因此瀏覽器不再直接請求JSP的API,而是:
      1)瀏覽器請求服務器端的NodeJS;
      2)NodeJS再發起HTTP去請求JSP;
      3)JSP依然原樣API輸出JSON給NodeJS;
      4)NodeJS收到JSON後再渲染出HTML頁面;
      5)NodeJS直接將HTML頁面flush到瀏覽器;
      這樣,瀏覽器得到的就是普通的HTML頁面,而不用再發Ajax去請求服務器了。
 

nodejs優勢:

適配性up  —— 界面展示邏輯由node層自己維護 不同端即不同nodejs

響應速度up —— 不需要瀏覽器對數據進行處理 而是由 nodejs 中間層去做

(前端發出多個異步請求,nodejs中間層做這些請求的代理,統一給後端;

同樣,後端的數據 在nodejs中間層 統一裝好 一起給前端)

性能up —— 單一職責原則

異步與模板統一

—— 頁面整體是有 幾十個HTML 片段拼裝而成 

PHP 是同步include 這些片段,而node可以同步 ,讀文件可以並行

https://blog.csdn.net/fuzhongmin05/article/details/81591072

6.

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