Cookie
1.會話
會話:指用戶打開了一個瀏覽器,點擊了很多超鏈接,訪問了多個Web資源,後關閉瀏覽器,這個過程可以稱之爲“會話”。
有狀態的會話:例如一個學生來過咱們班的教室,下次再來的時候,我們就能記住他來過。這個就是有狀態的會話。
Eg:
一個網站如何證明你來過?
客戶端<——>服務端
1.服務端會給客戶一個 信件,客戶端下次訪問的時候,帶上這個信件,就可以被認出來了。(Cookie)。
2.服務器登記你來過了,下次再訪問的時候,會自動匹配你(Session)。
2保存會話的兩種技術:
Cookie:
- 客戶端技術(具有響應,請求)
Session:
- 服務器技術,利用此技術,我們可以保存,用戶的會話信息,我們可以把信息或者數據放在Session中。
常見場景:
網站登錄後,關閉瀏覽器再打開此網頁,一般情況下第二次進入都不用再次登錄了,賬戶信息會被記住。
3.Cookie
總結:
1.從請求中拿到Cookie信息。
2.服務器響應給客戶端Cookie。
代碼總結:
Cookie[] cookies = req.getCookies();//Cookie的獲取。
Cookie cookie = cookies[i];
cookie.getName()//獲取Cookie中的Key
cookie.getValue()//獲取Cookie中的Value
new Cookie("Last_LoginTime", System.currentTimeMillis() + "");//新建一個Cookie
cookie.setMaxAge(24*60*60)//設置Cookie的有效期,這裏24*60*60表示一天
resp.addCookie(cookie);//響應給客戶端一個Cookie
舉例:
Servlet:
package com.edwin.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.crypto.Data;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
/**
* @author Edwin D
* @date 2020.6.6 上午 8:28
*/
//保存用戶上次訪問的時間
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 服務器會保存你上次來時的時間,把這個時間封裝成一個信件,下次你帶來,就會知道是你來了。
// 解決中文亂碼問題
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");//解決網頁頁面亂碼
PrintWriter out = resp.getWriter();
// Cookie需要服務器從客戶端獲取。
Cookie[] cookies = req.getCookies();
// 自動創建時用數組,說明Cookie可能存在多個。
// 判斷Cookie是否存在
if (cookies != null) {
// 如果存在的操作
out.write("上次訪問的時間爲:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie1 = cookies[i];
if (cookie1.getName().equals("Last_LoginTime")) {
// 獲取Cookie中的值
long Last_LoginTime = Long.parseLong(cookie1.getValue());
Date date = new Date(Last_LoginTime);
out.write(date.toLocaleString());
System.out.println("上次訪問的時間爲:"+date.toLocaleString());
}
}
} else {
// 不存在的操作
out.write("這是您第一次訪問本網站!");
}
// 服務器給用戶響應一個Cookie
Cookie cookie2 = new Cookie("Last_LoginTime", System.currentTimeMillis() + "");
cookie2.setMaxAge(24*60*60);
resp.addCookie(cookie2);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Xml:
<servlet>
<servlet-name>Cookie1</servlet-name>
<servlet-class>com.edwin.servlet.CookieDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Cookie1</servlet-name>
<url-pattern>/Cookie1</url-pattern>
</servlet-mapping>
輸出:
細節問題:
1.Cookie一般會保存在本地的用戶目錄下APPdata。
2.一個網站的Cookie是否存在上限?
-
一個Cookie只能保存一個信息。
-
一個Web站點可以給用戶瀏覽器發送多個Cookie,最多存放20個。
-
Cookie大小有限制:最大4KB。
-
300個Cookie是瀏覽器的上限。
刪除Cookie:
1.不設置有效期,關閉瀏覽器後,會自動失效。
2.設置有效期爲:0,效果同上。
代碼:
Servlet:
package com.edwin.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.crypto.Data;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author Edwin D
* @date 2020.6.6 上午 10:22
*/
//保存用戶上次訪問的時間
public class CookieDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("Last_LoginTime", System.currentTimeMillis() + "");
cookie.setMaxAge(0);//清除代碼。
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
XML:
<servlet>
<servlet-name>Cookie2</servlet-name>
<servlet-class>com.edwin.servlet.CookieDemo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Cookie2</servlet-name>
<url-pattern>/Cookie2</url-pattern>
</servlet-mapping>
操作前:
操作後:
編碼,解碼:
用於特殊情況下的亂碼解決。
//編碼
Cookie cookie = new Cookie("name", URLEncoder.encode("Edwin 段","Utf-8");
//解碼
out.write(URLEncoder.encode(cookie1.getValue(),"Utf-8");
參考文獻
《【狂神說Java】JavaWeb入門到實戰》
2020.06.07