後端JAVAWeb工程師必須掌握的三個內容!!

我們都是作爲一個JAVA開發,之前有好幾次出去面試,面試官都問我,JAVAWeb掌握的怎麼樣,我當時就不知道怎麼回答,Web,日常開發中用的是什麼?今天我們來說說JAVAWeb最應該掌握的三個內容。

JAVAWeb知識點一 --Cookie

作爲一個進入職場一年的年輕人來說,可能還沒有很強的能力達到從前端的HTML,CSS和JS再到後端的JAVA代碼通通都是自己寫,但是至少在前後端交互的過程中,我們應該瞭解他們之間交互的一些東西,比如:我下面所說的內容一

Cookie

在Web應用中,HTTP請求是無狀態的。也就是說用戶第一次發起請求,與服務器建立連接並登錄成功後,爲了避免每次打開一個頁面都需要登錄一下,就出現了Cookie,Session。

我們先來說說這個Cookie。

Cookie翻譯成中文的意思是‘小甜餅’,是由W3C組織提出,最早由Netscape社區發展的一種機制。目前Cookie已經成爲標準,所有的主流瀏覽器如IE、Netscape、Firefox、Opera等都支持Cookie。

服務器單從網絡連接上無從知道客戶身份。怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,無論誰訪問都必須攜帶自己通行證。這樣服務器就能從通行證上確認客戶身份了。這就是Cookie的工作原理。

Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現Session的一種方式。Cookie存儲的數據量有限,且都是保存在客戶端瀏覽器中。不同的瀏覽器有不同的存儲大小,但一般不超過4KB。因此使用Cookie實際上只能存儲一小段的文本信息。

說到Cookie技術是將用戶的數據存儲到客戶端的技術,那麼我們的服務器端怎樣將一個Cookie發送到客戶端?服務器端又是怎樣接受客戶端攜帶的Cookie?

服務器端怎樣將一個Cookie發送到客戶端?

我們來寫一段小小的代碼

(1)創建Cookie:


    Cookie cookie = new Cookie(String cookieName,String cookieValue);

示例:
    Cookie cookie = new Cookie("username","zhangsan");
    那麼該cookie會以響應頭的形式發送給客戶端:
    Set-Cookie:"name=zhangsan"

(2)設置Cookie在客戶端的持久化時間:

    cookie.setMaxAge(int seconds); ---時間秒
    
    注意:如果不設置持久化時間,cookie會存儲在瀏覽器的內存中,瀏覽器關閉
    cookie信息銷燬(會話級別的cookie),如果設置持久化時間,cookie信息會	被持久化到瀏覽器的磁盤文件裏

示例:
    cookie.setMaxAge(10*60);
    設置cookie信息在瀏覽器的磁盤文件中存儲的時間是10分鐘,過期瀏覽器自動刪除該cookie信息

(3)設置Cookie的攜帶路徑:

    cookie.setPath(String path);
    注意:如果不設置攜帶路徑,那麼該cookie信息會在訪問產生該cookie的web資源所在的路徑都攜帶cookie信息
示例:
    cookie.setPath("/match01");
    代表訪問match01應用中的任何資源都攜帶cookie
    cookie.setPath("/match01/cookieServlet");
    代表訪問match01中的cookieServlet時才攜帶cookie信息

(4)向客戶端發送cookie:

    response.addCookie(Cookie cookie);

(5)刪除客戶端的cookie

    如果想刪除客戶端的已經存儲的cookie信息,那麼就使用同名同路徑的持久化時	間爲0的cookie進行覆蓋即可

我們再來說說服務器端怎麼接受客戶端攜帶的Cookie?

cookie信息是以請求頭的方式發送到服務器端的:Cookie:“name=zhangsan”

(1)通過request獲得所有的Cookie;

Cookie[] cookies = request.getCookies();

(2)遍歷Cookie數組,通過Cookie的名稱獲得我們想要的Cookie

    for(Cookie cookie : cookies){
        if(cookie.getName().equal(cookieName)){
        String cookieValue = cookie.getValue();
    }
}

上面的簡單代碼就是對Cookie的一些簡單的操作,具體情況肯定要根據具體情況來進行分析,怎麼使用,那就得全靠大家自己來進行實際操作了。Cookie還有很多操作的方法,有興趣的可以去jar包中研究一下他的源碼,Cookie類位於包javax.servlet.http.*的下面。

注意:Cookie功能需要瀏覽器的支持。如果瀏覽器不支持Cookie(如大部分手機中的瀏覽器)或者把Cookie禁用了,Cookie功能就會失效。不同的瀏覽器採用不同的方式保存Cookie。IE瀏覽器會在“C:\Documents and Settings\你的用戶名\Cookies”文件夾下以文本文件形式保存,一個文本文件保存一個Cookie。

Cookies最典型的應用是判定註冊用戶是否已經登錄網站,用戶可能會得到提示,是否在下一次進入此網站時保留用戶信息以便簡化登錄手續,這些都是Cookies的功用。另一個重要應用場合是“購物車”之類處理。用戶可能會在一段時間內在同一家網站的不同頁面中選擇不同的商品,這些信息都會寫入Cookies,以便在最後付款時提取信息。

JAVAWeb知識點二 --Session

Session

除了使用Cookie,Web應用程序中還經常使用Session來記錄客戶端狀態。Session技術是將數據存儲在服務器端的技術,會爲每個客戶端都創建一塊內存空間 存儲客戶的數據,但客戶端需要每次都攜帶一個標識ID去服務器中尋找屬於自己的內 存空間。所以說Session的實現是基於Cookie,Session需要藉助於Cookie存儲客 戶的唯一性標識JSESSIONID。

我們從三個方面來分析這個Session。

1.怎樣獲得屬於本客戶端的session對象(內存區域)?

2.怎樣向session中存取數據(session也是一個域對象)?

3.session對象的生命週期?

(1)獲得Session對象

    HttpSession session = request.getSession();
    此方法會獲得專屬於當前會話的Session對象,如果服務器端沒有該會話的Session對象會創建一個新的Session返回,
    如果已經有了屬於該會話的Session直接將已有	的Session返回(實質就是根據JSESSIONID判斷該客戶端是否在服務器上已經存在	session了)

(2)怎樣向session中存取數據(session也是一個域對象)

Session也是存儲數據的區域對象,所以session對象也具有如下三個方法:
    session.setAttribute(String name,Object obj);
    session.getAttribute(String name);
    session.removeAttribute(String name);

(3)Session對象的生命週期

第三點也是面試裏面會經常問到的內容,不論是筆試還是面試,都經常會出現這個問題。

創建:第一次執行request.getSession()時創建

銷燬:
1)服務器(非正常)關閉時

2)session過期/失效(默認30分鐘)也有人說是20分鐘,我專門去tomcat的conf目錄下面的web.xml看過了,我可以肯定是30分鐘。

問題:時間的起算點 從何時開始計算30分鐘?
從不操作服務器端的資源開始計時

可以在工程的web.xml中進行配置

    <session-config>
            <session-timeout>30</session-timeout>
    </session-config>

3)手動銷燬session

session.invalidate();

作用範圍:默認在一次會話中,也就是說在,一次會話中任何資源公用一個session對象

面試題:瀏覽器關閉,session就銷燬了? 不對.

Session生成後,只要用戶繼續訪問,服務器就會更新Session的最後訪問時間,並維護該Session。爲防止內存溢出,服務器會把長時間內沒有活躍的Session從內存刪除。這個時間就是Session的超時時間。如果超過了超時時間沒訪問過服務器,Session就自動失效了。

JAVAWeb知識點二 --Token

Token

什麼是token?

token的意思是“令牌”,是服務端生成的一串字符串,作爲客戶端進行請求的一個標識。

當用戶第一次登錄後,服務器生成一個token並將此token返回給客戶端,以後客戶端只需帶上這個token前來請求數據即可,無需再次帶上用戶名和密碼。

簡單token的組成;uid(用戶唯一的身份標識)、time(當前時間的時間戳)、sign(簽名,token的前幾位以哈希算法壓縮成的一定長度的十六進制字符串。爲防止token泄露)。

Token的作用是什麼呢?

(1)防止表單重複提交

防止表單重複提交一般還是使用前後端都限制的方式,比如:在前端點擊提交之後,將按鈕置爲灰色,不可再次點擊,然後客戶端和服務端的token各自獨立存儲,客戶端存儲在Cookie或者Form的隱藏域(放在Form隱藏域中的時候,需要每個表單)中,服務端存儲在Session(單機系統中可以使用)或者其他緩存系統(分佈式系統可以使用)中。

(2)用來作身份驗證,一般情況下用在APP中。

用戶在登錄APP時,APP端會發送加密的用戶名和密碼到服務器,服務器驗證用戶名和密碼,如果驗證成功,就會生成相應位數的字符產作爲token存儲到服務器中,並且將該token返回給APP端。

以後APP再次請求時,凡是需要驗證的地方都要帶上該token,然後服務器端驗證token,成功返回所需要的結果,失敗返回錯誤信息,讓用戶重新登錄。其中,服務器上會給token設置一個有效期,每次APP請求的時候都驗證token和有效期。

而我們又怎麼去存儲這個Token而且防止Token泄露呢?

Token的存儲方式:

Token可以存到數據庫中,但是有可能查詢token的時間會過長導致token丟失(其實token丟失了再重新認證一個就好,但是別丟太頻繁,別讓用戶沒事兒就去認證)。

爲了避免查詢時間過長,可以將token放到內存中。這樣查詢速度絕對就不是問題了,也不用太擔心佔據內存,就算token是一個32位的字符串,應用的用戶量在百萬級或者千萬級,也是佔不了多少內存的。

Token的加密

在存儲的時候把token進行對稱加密存儲,用到的時候再解密。我們可以將請求URL、時間戳、token三者合併,通過算法進行加密處理。至於這個算法,等待之後的文章中去專門研究這個加密和解密的操作。

還有一點,在網絡層面上Token使用明文傳輸的話是非常危險的,所以一定要使用HTTPS協議。

我是懿,一個正在被打擊還在努力前進的碼農。歡迎大家關注我們的公衆號,加入我們的知識星球,我們在知識星球中等着你的加入。

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