[精讚] [會員登入]
365

【Wicket】[Cookie]如何讀取和設定客戶端的Cookie

對於某些參數需要給予使用者,我們可以使用 Cookie 來讓客戶端記著,之後再跟伺服器裡的比對來達到驗證的目的

分享此文連結 //n.sfs.tw/15727

分享連結 【Wicket】[Cookie]如何讀取和設定客戶端的Cookie@小編過路君子
(文章歡迎轉載,務必尊重版權註明連結來源)
2022-04-03 19:46:40 最後編修
2022-04-03 12:21:02 By 過路君子
 

哈囉大家好,這裡是覺得pom.xml越來越肥的小編過路君子

為了使用某一些功能,而導入一個 jar 包,結果為了使用另一功能,又再次導入其他的 jar 包......

 

 

有時候我們會需要主動地給予進入網站的每個人一個 Cookie 值,而這件事情既可以使用 javascript 做,當然也可以由我們後端來進行。

換句話說,除了使用 document.cookie 以外,還有另一個使用檔頭的 Set-Cookie 來設置的方式。

而我們今天的主題就是如何操作 Wicket 來設置 cookie。

 

首先,我們先在 pom.xml 底下添加以下訊息:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

然後我們就可以給予或是取得客戶端的 cookie 了。

 

給予客戶端新的 cookie 值

那一般由伺服器端給予的 cookie 都會寫在檔頭的 Set-Cookie 裡,而客戶端一旦接收到就會自行地將其記錄下來。

所以現在問題就變成了如何讓 Wicket 在檔頭裡面夾帶我們所想要讓客戶端設定的 cookie。

import javax.servlet.http.Cookie;
import org.apache.wicket.request.http.WebResponse;
import org.apache.wicket.request.cycle.RequestCycle;

public class index extends WebPage
{
    public index()
    {
        String cookieValue = "abc123";

        /* 創建新的 cookie */
        Cookie cookie = new Cookie("cookieName", cookieValue);

        WebResponse webResponse = (WebResponse)RequestCycle.get().getResponse();    //取得當前回應檔頭
        webResponse.addCookie(cookie);    //將剛剛我們創建新的 cookie 添加進回應檔頭內
    }
}

那各位現在就可以回去瀏覽器,然後重新載入,觀察回應檔頭是否有出現我們所設定的 cookie。

這時,也可以直接使用 javascript 調用。

 

 

讀取客戶端現有的 cookie 值

當客戶端取得 cookie 的時候,之後都會將值帶給伺服器,所以這時伺服器也可以去讀取客戶端的 cookie 了。

import javax.servlet.http.Cookie;
import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.request.cycle.RequestCycle;

public class index extends WebPage
{
    public index()
    {
        /* 取得收到的請求籤頭資訊 */
        WebRequest request = (WebRequest) RequestCycle.get().getRequest();

        /* 取得名為 cookieName 的 cookie 值 */
        Cookie cookie = request.getCookie("cookieName");
        String cookieValue = cookie.getValue()
    }
}

我們就以取得剛剛設定的 cookieName 為例,現在 "abc123" 就已經被儲存在 cookieValue 這個變數裡面囉。

 

 

結合Session使用

通常我們不會將所有的資訊全部傳送給客戶端,只會使用 Cookie 紀錄該用戶的 Session ID,之後用戶便可以透過該 Session ID 來持續向伺服器獲取個人訊息。

換句話說,我們今天要製作一個自動登入功能的時候,就會給客戶端一個特殊的 ID,每次客戶端只要拿這個 ID 就可以直接入場,那沒有怎麼辦?給客戶端一個呀,對不對。

import javax.servlet.http.Cookie;
import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.request.http.WebResponse;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.wicket.request.cycle.RequestCycle;

public class index extends WebPage
{
    public index()
    {
        Cookie cookie;
        try
        {
            /* 嘗試讀取客戶端是否擁有 Session ID */
            WebRequest request = (WebRequest) RequestCycle.get().getRequest();
            cookie = request.getCookie("ID");
        }
        catch(Exception error)
        {
            /* 產生 57 碼長的隨機 ID */
            String ID = RandomStringUtils.randomAlphanumeric(57);

            /* 將新產生的 ID 交給客戶端 */
            cookie = new Cookie("ID", ID);
            WebResponse webResponse = (WebResponse)RequestCycle.get().getResponse();
            webResponse.addCookie(cookie);
        }
    }
}

這樣就是一個簡單讀取客戶端是否具有一組特殊 ID 的方式,那其中例如 Session 的添加以及 Session ID 的驗證,也可以順手完成。

那隨機產生 ID 小編是使用第三方的 jar 包來達成,各位可以依照喜好或習慣選擇產生方式,相關的 dependency 資訊如下:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

 

 

修改客戶端現有的 Cookie 值

除了更新 Cookie 值以外,還可以設定其他屬性,例如逾時( maximum age )等......

詳細資訊可以參考:javax.servlet.http.Cookie

import javax.servlet.http.Cookie;
import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.request.http.WebResponse;
import org.apache.wicket.request.cycle.RequestCycle;

public class index extends WebPage
{
    public index()
    {
        /* 取得籤頭中的 Cookie */
        WebRequest request = (WebRequest) RequestCycle.get().getRequest();
        Cookie cookie = request.getCookie("ID");

        /* 更新名為 ID 的 cookie 值 */
        cookie.setValue("another");

        /* 將更新後的 Cookie 值告訴客戶端並請求更新 */
        WebResponse webResponse = (WebResponse)RequestCycle.get().getResponse();
        webResponse.addCookie(cookie);
    }
}

一定要做回送的動作,要不客戶端永遠都不知道我們已經更新了 cookie 值。

 

 

 

後記

後來小編解決過多的 jar 檔的方式就是 —— 沒辦法解決。

所以寫了一個文件檔來解釋所用的所有 jar 檔,還附上了相關 API 的網址,這樣至少以後忘記的時候可以查看一下。

END

你可能感興趣的文章

【Javascript】(Event)常用的網頁事件 不寫下來絕對下又會忘記,然後每次又都要回到MDN去查,麻煩

【無料版模】﹝CSS&HTML﹞製作epub電子書版模免費下載&附使用教學 一個專門用來製作epub的簡單CSS檔案,基本上已經可以做出一本還不錯的電子書,讓妳的電子書不在只有預設的字體、樣式

【C++】一些好用的C++小功能 —— 貳 承襲上一篇的C++小功能,筆記下來以免自己以後忘記了。

【C++】如何解決TLE,換句話說便是加速cin, cout的執行速度 [ZERO JUDGE](UVa) a159: 11743 - Credit Check 題目練習和副程式練習

【Wicket】[Cookie]如何讀取和設定客戶端的Cookie 對於某些參數需要給予使用者,我們可以使用 Cookie 來讓客戶端記著,之後再跟伺服器裡的比對來達到驗證的目的

【Maven / Jython】建立可直接執行的JAR檔案 以小編的前一篇文章為基礎,加了一些新東西進去,就變成另一個樣貌了

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

高捷少女:耐耐的新年驚喜④ 「雖然夫人一直有在保養身體,可是年紀畢竟不小了,醫生曾經說過,不管是不是假性陣痛,一旦夫人有感覺了便立刻送到醫院。」管家爺爺說:「我們已經打電話給附近的大型醫院,救護車很快便會來到這裡。」「去看伯母吧

【歌評】蓮台野夜行 - 少女秘封倶楽部 少女秘封俱樂部 我們的主角終於出場啦!這首歌一反蓮台野夜行的固有風格,總是華麗的開始又華麗的結束!

【日翻中歌詞】LOSER 一如往常的孤身一人 早就已經被折磨殆盡 明明就已經無處可去 卻作著白日夢 晚安 無論何時都是這個樣子 對懵懂夜晚早感到噁心

【英翻中歌詞】(二創歌)東方妖妖夢-人形裁判 ~玩弄人偶的少女 人形裁判 ~ 人の形弄びし少女 很久很久以前,在一個神奇的異地,住著一位少女,十分惹人憐愛 她的皮膚就像陶瓷一樣潔白,眼睛就像藍色寶珠般明亮

艾米莉亞和高捷戀旅② 七點三十五分了。 「快到粉絲團!快!」小穹慌張地說,婕兒、耐耐也湊向手機。雖然她們沒有報名,不過也希望亦晨參賽,不免著急起來。 「亦晨?妳的報名序號是多少?」艾米快速滑動手機。合格的參賽者姓名和序號都