Cookie技術(三)
一、Cookie技術
瀏覽器向伺服器端傳送請求,傳送請求肯定是訪問某一個資源servlet,當訪問第一個servlet時,響應會有一個set-cookie2:name=洗衣機,當再次傳送請求時,會把Cookie帶過來,然後在servlet2中就可以得到這個資訊。
二、Cookie程式碼--建立Cookie
package com.it.servlet.cookie; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Demo1Servlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //將商品資訊記錄到Cookie中。 Cookie cookie = new Cookie("phone","iphone9"); //要將Cookie帶回到瀏覽器端 response.addCookie(cookie); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
首先編寫Demo1Servlet,用到了Cookie類,根據API,Cookie類的構造方法為public Cookie(String name, String value),編寫構造方法,給一個名字,給一個值。
知識點:
1. Cookie類的構造方法:Cookie cookie = new Cookie(String name, String value);
2. 要想將Cookie資訊攜帶到瀏覽器端,需要使用response.addCookie(Cookie cookie);
瀏覽器端訪問/demo1,通過抓包,發現第一次訪問,響應裡面有Set-Cookie:phone=iphone9,請求裡面沒有Cookie資訊;第二次訪問demo1,請求裡面有:Cookie:phone=iPhone9,響應裡面有:Set-Cookie:phone=iPhone9。
畫圖表示:
瀏覽器訪問伺服器端Demo1Servlet,Demo1Servlet建立Cookie,並將Cookie資訊攜帶給瀏覽器,瀏覽器將Cookie資訊儲存到瀏覽器快取中,然後
三、獲取Cookie資訊
1. 要想在伺服器端獲取所有的Cookie,Cookie[] cookie = request.getCookies();
2. Cookie類中提供方法,getName()獲取Cookie名稱,getValue()獲取Cookie值。
注意:
1.Cookie不能存中文。Cookie既可以快取在瀏覽器中,也可以產生Cookie檔案。但本身格式都不可以存中文。
四、示例:顯示使用者上一次訪問時間
package com.it.servlet.cookie;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ShowTimeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 得到所有的Cookie
Cookie[] cookies = request.getCookies();
// 得到一個表示時間的Cookie
Cookie cookie = getCookie("time", cookies);
if (cookie == null) {
response.getWriter().write("第一次訪問該網站");
Cookie newCookie = new Cookie("time", System.currentTimeMillis() + "");
response.addCookie(newCookie);
} else {
String time = cookie.getValue();
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = dateformat.format(Long.parseLong(time)) + "";
response.getWriter().write(dateStr);
cookie.setValue(System.currentTimeMillis()+"");
response.addCookie(cookie);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
public Cookie getCookie(String name, Cookie[] cookies) {
if (null == cookies || cookies.length == 0) {
return null;
} else {
for (Cookie cookie : cookies) {
if ("time".equals(cookie.getName())) {
return cookie;
}
}
}
return null;
}
}
六、Cookie常用API:
new Cookie(String name, String value);
getName(); //獲取名稱
getValue(); //獲取
setValue(); // 設定值
setMaxAge // cookie資訊儲存在瀏覽器的記憶體裡,臨時訪問,當瀏覽器關閉,Cookie資訊隨之消失。Cookie持久化儲存就用到了maxAge。如果建立了一個Cookie,並將它傳送到瀏覽器,預設情況下,他是一個會話級別的Cookie(即儲存在瀏覽器的記憶體中),使用者退出瀏覽器即被刪除。若希望瀏覽器將Cookie儲存在磁碟上,則需要使用maxAge,並給出一個以秒為單位的時間。刪除持久Cookie,可以將Cookie最大失效設為0,注意,刪除Cookie,path必須一致,否則不會刪除。
cookie.setMaxAge(60*60*24*7); //讓Cookie持久化儲存,7天
getMaxAge
setPath 這個方法很重要,必須會。Cookie屬於某一個工程,畫Cookie圖,為什麼能攜帶Cookie,是因為它們的path一致。通過setPath,可以設定Cookie屬於某一個站點或應用,當訪問時,只要是這個站點下的Cookie就攜帶過來。
Cookie什麼時候攜帶,取決於path值.
預設值:cookie.setPath("/day9_1") --- 實際開發中用
訪問當前伺服器下任何一個工程,都攜帶所有 Cookie : cookie.setPath("/")
API:指定客戶端應該返回Cookie的路徑。Cookie對於指定目錄中的所有頁面及該目錄子目錄中的所有頁面都是可見的。Cookie的路徑必須包括設定Cookie的servlet,例如/catalog,它使Cookie對於伺服器上/catalog下的所有目錄都是可見的。
用於設定Cookie在訪問什麼樣的資源時會攜帶,就是設定Cookie的路徑。
刪除Cookie:設定setMaxAge,0 立即刪除Cookie,-1 瀏覽器關閉後刪除。
注意事項:刪除Cookie,必須path一致。執行過的程式碼,設定Cookie的path值為"/",向刪除Cookie,設定程式中的setMaxPath(0),並且要設定path一致,才可以刪除。
setDomain設定Cookie的有效域名。
訪問A網站,生成A網站的Cookie --- 第一方Cookie(安全Cookie)
訪問A網站,生成B網站的Cookie --- 第三方Cookie(惡意Cookie)
現在的瀏覽器已經把第三方Cookie遮蔽掉了