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的。
相關文章
- Cookie新增、獲取以及刪除操作Cookie
- Response-->cookie的新增和刪除Cookie
- 新增cookie、刪除cookie、清除cookieCookie
- Cookie 的新增與刪除Cookie
- 如何設定cookie和刪除cookieCookie
- Java操作Cookie之新增CookieJavaCookie
- javascript新增刪除cookie程式碼JavaScriptCookie
- vue實現li列表的新增刪除和修改Vue
- Jquery和js實現cookie操作手機浮層廣告;附加:js獲取、新增、刪除cookiejQueryJSCookie
- Java Spring刪除cookieJavaSpringCookie
- jQuery如何新增和刪除元素jQuery
- asp.net 對xml檔案的讀寫,新增,修改,刪除操作ASP.NETXML
- cookie的有效期和刪除Cookie
- ASP.NET新增、修改、刪除web.config配置資訊ASP.NETWeb
- C#對DataGridView進行新增、修改、刪除資料操作C#View
- js如何刪除和新增table中的行和列JS
- javascript如何動態新增和刪除元素JavaScript
- cookie的設定、獲取和刪除Cookie
- javascript cookie的儲存和刪除功能JavaScriptCookie
- jquery table 的新增和刪除jQuery
- redis cluster節點/新增刪除操作Redis
- JavaScript 刪除cookieJavaScriptCookie
- 在 Git 中怎樣克隆、修改、新增和刪除檔案?Git
- 如何動態新增和刪除一個div
- jQuery 新增和刪除classjQuery
- Solr 刪除和新增 indexSolrIndex
- Java 操作PDF中的超連結——新增、更新、刪除超連結Java
- Win10系統中PIN碼新增、修改以及刪除的操作步驟Win10
- oracle JOB 查詢 新增 修改 刪除 執行Oracle
- Java Web之Cookie和Session的理解JavaWebCookieSession
- Mysql資料庫值的新增、修改、刪除及清空MySql資料庫
- Oracle使用者的新增、修改、刪除及授權Oracle
- jQuery實現的表格新增或者刪除行操作jQuery
- jQuery table表格行的新增和刪除jQuery
- ASM的管理----刪除和新增磁碟組ASM
- Java 操作PPT數字簽名(一):新增、檢測、刪除簽名Java
- Oracle 增加修改刪除欄位與新增註釋Oracle
- Android資料庫高手祕籍(6):LitePal的修改和刪除操作Android資料庫