1. 程式人生 > >Java Web如何操作Cookie的新增修改和刪除

Java Web如何操作Cookie的新增修改和刪除

一、Cookie是什麼

Cookie是伺服器存放在客戶端瀏覽器上的一些小資料,可以使用Cookie完成與伺服器的一些互動動作。伺服器可以通過HTTP響應頭將Cookie傳送給瀏覽器,而瀏覽器如果支援儲存Cookie,則將HTTP響應頭資訊中的Cookie內容存放到瀏覽器中。當瀏覽器請求訪問一個網站時,如果這個網站在此瀏覽器中存放有Cookie內容,瀏覽器會將Cookie內容附加到HTTP請求頭資訊中傳送給伺服器。鑑於此,Cookie存放的內容是不宜過多的,一般瀏覽器也是這樣規定的。

瀏覽器應該支援每臺 Web 伺服器有 20 個 cookie,總共有 300 個 cookie,並且可能將每個 cookie 的大小限定為 4 KB。

二、Servlet如何建立Cookie物件

Java Web提供了一個Cookie類:javax.servlet.http.Cookie

建立Cookie物件

Cookie是一個類似於鍵值對的資料,通過Cookie的構造方法Cookie(String name, String value)建立一個Cookie物件,不過Cookie與鍵值對資料不同的一點兒是,儲存在瀏覽器中的Cookie物件可以擁有相同的name值,這點兒在後面獲取Cookie物件的時候需要特別注意。

修改Cookie值

建立好Cookie物件後,我們可以通過setValue(String newValue)方法修改值,通過getValue()

獲取值。

新增Cookie描述

為了方便客戶端使用者檢視Cookie資訊,可以通過setComment(String purpose)方法設定一個描述資訊,Cookie還沒有傳送前,通過getComment()方法獲取描述資訊。

設定Cookie有效期和刪除Cookie

存放在客戶端的Cookie是有有效期的,可以通過setMaxAge(int expiry)方法設定這個Cookie可以儲存好長時間,單位為秒,這是一個時間長度,不是一個時間點Timestamp。如果沒有設定有效期,則預設為-1(或者說小於0的值),表示在瀏覽器關閉時就刪除Cookie內容,如果有效期設定為0,則表示通知瀏覽器立即刪除這個Cookie。

設定Cookie作用範圍和域

我們還可以指定Cookie在哪個網頁才有效,通過setPath(String uri)方法即可設定,如果值為“/”表示作用範圍為整個網站,預設是這個值。

另外還可以指定這個Cooke對其他網站有效(也就是不同的域),通過setDomain(String pattern)方法來實現,不過需要注意的是,一般瀏覽器是不允許一個網站設定另外網站的Cookie內容的,所以這個用處不大。實在要做,就需要修改瀏覽器的配置才行。

Cookie中文問題

Cookie有一點兒不好的就是不支援中文,這點兒一定要注意了,如果忘Cookie中添加了中文內容,則系統會丟擲異常內容:

java.lang.IllegalArgumentException: Control character in cookie value, consider BASE64 encoding your value

如果確實需要寫入中文,則需要進行BASE64轉碼才行。在讀取Cookie的時候又需要進行反轉碼。

三、如何向客戶端寫入Cookie

前面說了,Cookie寫入瀏覽器是通過HTTP響應頭帶入的。在Java Web開發中Response物件已經幫我們完成了這個工作,通過Response的addCookie(Cookie cookie)方法就可以向瀏覽器寫入Cookie內容了。一個響應頭可以帶入多個Cookie,所以這個方法也可以多次呼叫,一次寫入多個Cookie。

四、獲取客戶端傳送來的Cookie

跟向瀏覽器寫入Cookie相反,客戶端通過HTTP請求頭將Cookie帶入傳送給伺服器。通過Request.getCookies()方法可以獲取到從客戶端傳送來的Cookie陣列。不過從瀏覽器傳送過來的Cookie物件只有name屬性和value屬性,其他有效期,有效路徑等都是沒有的。而且可以有多個相同的name屬性的,所以判斷是不是我們需要的Cookie需要審慎的。

五、實現程式碼

新增Cookie:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.建立Cookie物件
        Cookie cookie1 = new Cookie("webname", "XCoder Studio");
        // 2.配置Cookie物件
        cookie1.setComment("Web Host Name");    // Cookie描述
        cookie1.setMaxAge(24*60*60);            // Cookie有效時間
        //cookie1.setPath("/");                 // Cookie有效路徑

        // 3.通過response物件將Cookie寫入瀏覽器,當然需要解決中文亂碼問題,否則會丟擲異常
        // java.lang.IllegalArgumentException: Control character in cookie value, consider BASE64 encoding your value
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        response.addCookie(cookie1);

        // 跳轉到首頁
        response.sendRedirect("./index.jsp");
    }

讀取Cookie:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 讀取Cookie,通過request請求讀取Cookie
    Cookie[] cookies = request.getCookies();

    // 判斷是否存在Cookie,不存在跳轉到首頁
    if (cookies == null) {
        response.sendRedirect("./index.jsp");
        return;
    }

    // 處理輸出中文亂碼問題
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    // 獲取輸出物件
    PrintWriter out = response.getWriter();
    // 迭代處理客戶端傳送來的Cookie物件

    for (Cookie cookie:cookies) {
        out.println("Cookie名   稱:"+cookie.getName()+"<br />");
        out.println("Cookie儲   值:"+cookie.getValue()+"<br />");
        out.println("Cookie備   注:"+cookie.getComment()+"<br />");
        out.println("Cookie有效時間:"+cookie.getMaxAge()+"<br />");
        out.println("Cookie有效路徑:"+cookie.getPath()+"<br />");
        out.println("Cookie有效域名:"+cookie.getDomain()+"<br />");
        out.println("<a href=\"./CookieDel?name="+cookie.getName()+"\">刪除Cookie</a><br />");
        out.println("---------------------------------------------------------<br />");
    }
}

刪除Cookie:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 獲取GET傳遞引數名稱
    String delName = request.getParameter("name");
    if (delName == null) {
        response.sendRedirect("./CookieRead");
        return;
    }

    // 獲取Cookies陣列
    Cookie[] cookies = request.getCookies();
    // 迭代查詢並清除Cookie
    for (Cookie cookie: cookies) {
        if (delName.equals(cookie.getName())) {
            cookie.setMaxAge(0);
            response.addCookie(cookie);
        }
    }

    response.setHeader("refresh", "3;./CookieRead");
    PrintWriter out = response.getWriter();
    out.println("Will go back after 3 seconds...");
}

執行會發現讀取Cookie時,所以的有效時間都是Null的。

相關推薦

Java Web如何操作Cookie新增修改刪除

一、Cookie是什麼 Cookie是伺服器存放在客戶端瀏覽器上的一些小資料,可以使用Cookie完成與伺服器的一些互動動作。伺服器可以通過HTTP響應頭將Cookie傳送給瀏覽器,而瀏覽器如果支援儲存Cookie,則將HTTP響應頭資訊中的Cookie內容存放到瀏覽器中。

給jqGrid資料行新增修改刪除操作連結(可以執行)

我這裡用的不是jqGrid的自帶的編輯和刪除操作,我已經把分頁導航欄下的編輯,刪除,搜尋都取消掉了,就是這句$("#list1").navGrid("#pager1",{edit:false,del:false, search:false}), 然後在資料載入完成後,給每行

關於Cookie 的HttpOnly屬性(java/web操作cookie+Tomcat操作jsessionid)

public class CookieFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOExcept

【C#】C#操作XML方法:新增修改刪除節點與屬性

 一 前言 先來了解下操作XML所涉及到的幾個類及之間的關係  如果大家發現少寫了一些常用的方法,麻煩在評論中指出,我一定會補上的!謝謝大家 * 1 XMLElement 主要是針對節點的一些屬性進行操作 * 2 XMLDocument 主要是針對節點的CUID操作 *

cookie的封裝刪除修改

空格 如果 getc += spl dddd lse options 分離 一、設置 name = value; path = 路徑; expires = new Date(); var d = new Date(); d.setDate(30) doc

mongodb修改刪除操作

修改資料修改裡面還有查詢條件。你要該誰,要告訴 mongo。查詢名字叫做小明的,把年齡更改為 16 歲:1 db.student.update({"name":"小明"},{$set:{"age":16}});查詢數學成績是 70,把年齡更改為 33 歲: 1 db.student.update({"sco

JDBC實現修改刪除操作

工具:Myeclipse(Eclipse): 知識點:如何防止SQL注入攻擊和JDBC中的修改/刪除操作 jar包: commons-collections4-4.0.jar commons-dbcp-1.4.jar commons-pool-1.6.jar Oracle 1

Linux中新增修改刪除使用者使用者組

一、使用者:在建立使用者時,需要為新建使用者指定一使用者組,如果不指定其使用者所屬的工作組,自動會生成一個與使用者名稱同名的工作組。建立使用者user1的時候指定其所屬工作組users,例:useradd –g users user11、使用命令 useradd 建立使用者例

Git 本地的撤銷修改刪除操作

由於最近考試,其實是自己懶一直也沒有把部落格寫下去,今天就開始把以前的全部補回來 希望你在此能夠有此收穫,找到你想要找的問題 緊接上一篇部落格,想要從基礎學習的請從上篇看起 一:撤銷操作 比如我現在在readme.txt檔案裡面增加一行 內容為555

java實現對MySql資料庫中資料的讀取、插入、修改刪除

目標: 1、實現eclipse同資料庫的連線 2、在eclipse中用java實現對資料庫的控制 初學java和資料庫,本文是參考這篇文章的思路的學習筆記,程式碼實現了將4個控制函式(讀取、插入、修改和刪除)分別寫成4個靜態方法呼叫。 1. 關於java和MySQL的連

Android管理聯絡人(包含新增,查詢,修改刪除;以及不同版本區別)

通過Android系統提供的介面,可以很方便的管理聯絡人資訊。一、新增1、新增聯絡人1.6上的程式碼:String peopleName = "name";ContentValues personValues = new ContentValues();// namepers

MyBatis批量新增修改刪除

1. 批量新增元素session.insert(String string,Object o) public void batchInsertStudent() { List<Student> ls = new ArrayList<Student>

Quartz 2.2 動態新增修改刪除定時任務

下面直接上程式碼: QuartzManager.java 動態新增、修改和刪除定時任務管理類 import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org

C# 新增修改刪除PDF書籤

有時候我們在閱讀PDF文件時會遇到這樣一種情況:PDF文件頁數比較多,但是又沒有書籤,所以我們不能根據書籤快速瞭解文件所講解的內容,也不能點選書籤快速跳轉到相應的位置,而只能一頁一頁的翻閱,非常苦惱。相信開發人員在開發和PDF有關的應用程式時,也會有這樣的功能需求,因此在

Ajax實現新增修改刪除提示

 //新增驗證   function addCheck(){        if(document.getElementById("txtValue").value=="0"){alert("請輸入!!");return false;}    }   var xmlHttp

web前端之Ajax遍歷json後對每一條資料進行相應的修改刪除

web前端之ajax遍歷json後對每一條資料進行相應的修改和刪除 function serviceUser(){ $('.ergodicPersonList').remove(); $.ajax({ url: "/b

javascript操作table的動態新增刪除

動態新增表格行和刪除行,ie9和chrome上執行通過: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

任務調度開源框架Quartz動態添加、修改刪除定時任務

star play cit box sport nts str ignorecas tar 作者:Joyce-Luo Quartz 是個開源的作業調度框架,為在 Java 應用程序中進行作業調度提供了簡單卻強大的機制。Quartz框架包含了調度器監聽、

MySQL:創建、修改刪除

rop ont ... rst incr arc bigint 第一個 desc 1.創建數據庫:CREATE DATABASE 數據庫名;  刪除數據庫:DROP DATABASE 數據庫名;  查看數據庫編碼:SHOW CREATE DATABASE 數據庫名;

Linux中添加、修改刪除用戶用戶組

tty live 參數 項目 AR 格式 沒有 CA bin 寬為限 緊用功 功夫到 滯塞通 一、用戶: 在創建用戶時,需要為新建用戶指定一用戶組,如果不指定其用戶所屬的工作組,自動會生成一個與用戶名同名的工作組。創建用戶user1的時候指定其所屬工作組users,例: