A. java中如何獲取cookie
1.設置cookie到客戶端
Cookie c1 = new Cookie("username","hzh");
response.addCookie(c1);
Cookie c2 = new Cookie("password","123");
//設置生命周期為1小時,秒為單位
c2.setMaxAge(3600);
response.addCookie(c2);
response.getWriter().print("ok");
查看此時的cookie文件,發現只寫入了password,因為此時未給 username設置生命周期,它還在客戶端的內存中,並為寫到文件中(此時客戶端關閉此瀏覽器窗口,就丟失了),想寫到客戶端,需要加入c1.setMaxAge(3600)在 response.addCookie(c1);之前
以下是寫入我電腦中的cookie
2.讀取cookie文件
Cookie[] cookies = request.getCookies();
for(Cookie c :cookies ){
System.out.println(c.getName()+"--->"+c.getValue());
}
控制台輸出結果如下:
username--->hzh
password--->123
JSESSIONID--->
注意:
1.伺服器可以向客戶端寫內容, 只能是文本內容
2.客戶端可以阻止伺服器寫入,禁用cookies
3.只能讀取自己webapp寫入的東西
B. java里怎樣在客戶端獲取response的Cookie
以下代碼可以從java中獲得cookie,從request可以獲取客戶端保存的cookie。如果是html想活的cookie的話直接操作document.cookie就可以了,以下貼出java操作cookie代碼
Cookie[]cookies=request.getCookies();//這樣便可以獲取一個cookie數組
for(Cookiecookie:cookies){
cookie.getName();//getthecookiename
cookie.getValue();//getthecookievalue
}
C. java 怎麼設置cookie
java設置cookie是通過 Servlet 設置的。
通過 Servlet 設置 Cookies 包括三個步驟:
(1) 創建一個 Cookie 對象:您可以調用帶有 cookie 名稱和 cookie 值的 Cookie 構造函數,cookie 名稱和 cookie 值都是字元串。
Cookie cookie = new Cookie("key","value");
請記住,無論是名字還是值,都不應該包含空格或以下任何字元:
[ ] ( ) = , " / ? @ : ;
(2) 設置最大生存周期:您可以使用 setMaxAge 方法來指定 cookie 能夠保持有效的時間(以秒為單位)。下面將設置一個最長有效期為 24 小時的 cookie。
cookie.setMaxAge(60*60*24);
(3) 發送 Cookie 到 HTTP 響應頭:您可以使用 response.addCookie 來添加 HTTP 響應頭中的 Cookies,如下所示:
response.addCookie(cookie);
(4)完整實例:
// 導入必需的 java 庫
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// 擴展 HttpServlet 類
public class HelloForm extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// 為名字和姓氏創建 Cookies
Cookie firstName = new Cookie("first_name",
request.getParameter("first_name"));
Cookie lastName = new Cookie("last_name",
request.getParameter("last_name"));
// 為兩個 Cookies 設置過期日期為 24 小時後
firstName.setMaxAge(60*60*24);
lastName.setMaxAge(60*60*24);
// 在響應頭中添加兩個 Cookies
response.addCookie( firstName );
response.addCookie( lastName );
// 設置響應內容類型
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "設置 Cookies 實例";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>名字</b>:"
+ request.getParameter("first_name") + "\n</li>" +
" <li><b>姓氏</b>:"
+ request.getParameter("last_name") + "\n</li>" +
"</ul>\n" +
"</body></html>");
}
}
D. Java Socket實現HTTP客戶端來理解Session和Cookie的區別和聯系
在面試中 經常碰到請闡述session與的區別與聯系,以及如何修改兩者的有效時間。
大家都知道,session是存儲在伺服器端的,cookie是存儲在客戶端的,session依賴於cookie,但是讓你說詳細點,你會嗎?我是不太清楚的,特意在網上找了很多資料,發現一篇不錯的文章,特整理歸納在此,供有需要的朋友查看。
具體來說cookie機制採用的是在客戶端保持狀態的方案。它是在用戶端的會話狀態的存貯機制,他需要用戶打開客戶端的cookie支持。cookie的作用就是為了解決HTTP協議無狀態的缺陷所作的努力.
而session機制採用的是一種在客戶端與伺服器之間保持狀態的解決方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要藉助於cookie機制來達到保存標識的目的。而session提供了方便管理全局變數的方式
session是針對每一個用戶的,變數的值保存在伺服器上,用一個sessionID來區分是哪個用戶session變數,這個值是通過用戶的瀏覽器在訪問的時候返回給伺服器,當客戶禁用cookie時,這個值也可能設置為由get來返回給伺服器。
就安全性來說:當你訪問一個使用session 的站點,同時在自己機子上建立一個cookie,建議在伺服器端的SESSION機制更安全些.因為它不會任意讀取客戶存儲的信息。
正統的cookie分發是通過擴展HTTP協議來實現的,伺服器通過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie
從網路伺服器觀點看所有HTTP請求都獨立於先前請求。就是說每一個HTTP響應完全依賴於相應請求中包含的信息
狀態管理機制克服了HTTP的一些限制並允許網路客戶端及伺服器端維護請求間的關系。在這種關系維持的期間叫做會話(session)。
Cookies是伺服器在本地機器上存儲的小段文本並隨每一個請求發送至同一個伺服器。
session機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息。
當程序需要為某個客戶端的請求創建一個session的時候,伺服器首先檢查這個客戶端的請求里是否已包含了一個session標識 - 稱為 session id,如果已包含一個session id則說明以前已經為此客戶端創建過session,伺服器就按照session id把這個 session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含session id,則為此客戶端創建一個session並且生成一個與此session相關聯的session id,session id的值應該是一個既不會重復,又不容易被找到規律以仿造的字元串,這個 session id將被在本次響應中返回給客戶端保存。
在談論session機制的時候,常常聽到這樣一種誤解「只要關閉瀏覽器,session就消失了」。其實可以想像一下會員卡的例子,除非顧客主動對店家提出銷卡,否則店家絕對不會輕易刪除顧客的資料。對session來說也是一樣的,除非程序通知伺服器刪除一個session,否則伺服器會一直保留,程序一般都是在用戶做log off的時候發個指令去刪除session。然而瀏覽器從來不會主動在關閉之前通知伺服器它將要關閉,因此伺服器根本不會有機會知道瀏覽器已經關閉,之所以會有這種錯覺,是大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器後這個 session id就消失了,再次連接伺服器時也就無法找到原來的session。如果伺服器設置的cookie被保存到硬碟上,或者使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的session id發送給伺服器,則再次打開瀏覽器仍然能夠找到原來的session。
恰恰是由於關閉瀏覽器不會導致session被刪除,迫使伺服器為seesion設置了一個失效時間,當距離客戶端上一次使用session的時間超過這個失效時間時,伺服器就可以認為客戶端已經停止了活動,才會把session刪除以節省存儲空間。
大家都知道,http是無狀態的協議,客戶每次讀取web頁面時,伺服器都打開新的會話,而且伺服器也不會自動維護客戶的上下文信息,那麼要怎麼才能實現網上商店中的購物車呢,session就是一種保存上下文信息的機制,它是針對每一個用戶的,變數的值保存在伺服器端,通過SessionID來區分不同的客戶,session是以cookie或URL重寫為基礎的,默認使用cookie來實現,系統會創造一個名為JSESSIONID的輸出cookie,我們叫做session cookie,以區別persistent cookies,也就是我們通常所說的cookie,注意session cookie是存儲於瀏覽器內存中的,並不是寫到硬碟上的,這也就是我們剛才看到的JSESSIONID,我們通常情是看不到JSESSIONID的,但是當我們把瀏覽器的cookie禁止後,web伺服器會採用URL重寫的方式傳遞Sessionid,我們就可以在地址欄看到sessionid=KWJHUG6JJM65HS2K6之類的字元串。
明白了原理,我們就可以很容易的分辨出persistent cookies和session cookie的區別了,網上那些關於兩者安全性的討論也就一目瞭然了,session cookie針對某一次會話而言,會話結束session cookie也就隨著消失了,而persistent cookie只是存在於客戶端硬碟上的一段文本(通常是加密的),而且可能會遭到cookie欺騙以及針對cookie的跨站腳本攻擊,自然不如session cookie安全了。
通常session cookie是不能跨窗口使用的,當你新開了一個瀏覽器窗口進入相同頁面時,系統會賦予你一個新的sessionid,這樣我們信息共享的目的就達不到了,此時我們可以先把sessionid保存在persistent cookie中,然後在新窗口中讀出來,就可以得到上一個窗口SessionID了,這樣通過session cookie和persistent cookie的結合我們就實現了跨窗口的session tracking(會話跟蹤)。
在一些web開發的書中,往往只是簡單的把Session和cookie作為兩種並列的http傳送信息的方式,session cookies位於伺服器端,persistent cookie位於客戶端,可是session又是以cookie為基礎的,明白的兩者之間的聯系和區別,我們就不難選擇合適的技術來開發web service了。純屬復制