- 為什么要使用Cookie?
- 怎樣使用Cookie腺办?
- Cookie使用缺陷
- Cookie使用示例
1. 為什么要使用Cookie定鸟?
HTTP 是一個無狀態(tài)的協(xié)議悲没,這意味著每一次的請求都是獨立的望门,服務(wù)器和客戶端之間沒有辦法知道上一次請求和下一次請求的關(guān)系形娇,所以產(chǎn)生了Cookie。Cookie將數(shù)據(jù)保存到了客戶端筹误,方便下一次請求使用桐早。
作用
- cookie一般用于存出少量的不太敏感的數(shù)據(jù)
- 在不登錄的情況下,完成服務(wù)器對客戶端的身份識別
2. 怎樣使用Cookie厨剪?
2.1 創(chuàng)建Cookie對象哄酝,綁定數(shù)據(jù)
Cookie c = new Cookie(String name,String value);
注意:一個Cookie只能存儲一個字符串類型的數(shù)據(jù),不能存儲其他類型的數(shù)據(jù)
2.2 發(fā)送Cookie對象
response.addCookie(Cookie cookie);
2.3 獲取Cookie,拿到數(shù)據(jù)
Cookie[] request.getCookies()
獲取Cookie時為一個數(shù)組祷膳,通過數(shù)組的方式進行遍歷
2.4 設(shè)置Cookie存活時間
setMaxAge(int seconds)
2.5 使用Cookie完整案例
@WebServlet("/cookie1")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("msg","hello");
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}
@WebServlet("/cookie2")
public class CookieDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie [] cookies = req.getCookies();
for (Cookie c:cookies) {
if ("msg".equals(c.getName())){
System.out.println(c.getValue());
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
效果展示
3. Cookie使用缺陷
4. Cookie使用示例
@WebServlet("/cookie3")
public class CookieDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//設(shè)置響應(yīng)的消息體的數(shù)據(jù)格式以及編碼
response.setContentType("text/html;charset=utf-8");
//1.獲取所有Cookie
Cookie[] cookies = request.getCookies();
boolean flag = false;//沒有cookie為lastTime
//2.遍歷cookie數(shù)組
if(cookies != null && cookies.length > 0){
for (Cookie cookie : cookies) {
//3.獲取cookie的名稱
String name = cookie.getName();
//4.判斷名稱是否是:lastTime
if("lastTime".equals(name)){
//有該Cookie陶衅,不是第一次訪問
flag = true;//有l(wèi)astTime的cookie
//設(shè)置Cookie的value
//獲取當(dāng)前時間的字符串,重新設(shè)置Cookie的值直晨,重新發(fā)送cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
System.out.println("編碼前:"+str_date);
//URL編碼
str_date = URLEncoder.encode(str_date,"utf-8");
System.out.println("編碼后:"+str_date);
cookie.setValue(str_date);
//設(shè)置cookie的存活時間
cookie.setMaxAge(60 * 60 * 24 * 30);//一個月
response.addCookie(cookie);
//響應(yīng)數(shù)據(jù)
//獲取Cookie的value搀军,時間
String value = cookie.getValue();
System.out.println("解碼前:"+value);
//URL解碼:
value = URLDecoder.decode(value,"utf-8");
System.out.println("解碼后:"+value);
response.getWriter().write("<h1>歡迎回來,您上次訪問時間為:"+value+"</h1>");
break;
}
}
}
//第一次訪問
if(cookies == null || cookies.length == 0 || flag == false){
//設(shè)置Cookie的value
//獲取當(dāng)前時間的字符串勇皇,重新設(shè)置Cookie的值罩句,重新發(fā)送cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
System.out.println("編碼前:"+str_date);
//URL編碼
str_date = URLEncoder.encode(str_date,"utf-8");
System.out.println("編碼后:"+str_date);
Cookie cookie = new Cookie("lastTime",str_date);
//設(shè)置cookie的存活時間
cookie.setMaxAge(60 * 60 * 24 * 30);//一個月
response.addCookie(cookie);
response.getWriter().write("<h1>您好,歡迎您首次訪問</h1>");
}
}
}