017_Cookie
一. Cookie介紹
1. Cookie其實是一份小數(shù)據(jù), 是服務器給客戶端, 并且存儲在客戶端上的一份小數(shù)據(jù)。
2. 應用場景: 自動登錄、瀏覽記錄、購物車。
3. 為什么要有這個Cookie: http的請求是無狀態(tài)。 客戶端與服務器在通訊的時候, 是無狀態(tài)的, 其實就是客戶端在第二次來訪的時候, 服務器根本就不知道這個客戶端以前有沒有來訪問過。?Cooke就是為了更好的用戶體驗, 更好的交互[自動登錄], 其實從公司層面講, 就是為了更好的收集用戶習慣[大數(shù)據(jù)]。
4. 創(chuàng)建Cookie并發(fā)送給瀏覽器
4.1. 創(chuàng)建Cookie并發(fā)送給瀏覽器
4.2. 客戶端收到的信息里面, 響應頭中多了一個字段Set-Cookie。
4.2. 添加多個Cookie創(chuàng)建多個就行, 一個服務器最多添加20個Cookie。
5. 獲取Cookie
6. 清除Cookie
?
7. Cookie的常用方法
7.1.創(chuàng)建Cookie: new Cookie(“name”, “value”);
7.2.設(shè)置Cookie有效期: cookie.setMaxAge(60 * 60 * 24 * 30);
7.3.設(shè)置路徑, 只有訪問/UseCookie/LoginFilter.action這個路徑地址才會帶cookie: cookie.setPath("/UseCookie/LoginFilter.action");
7.4.設(shè)置域, 只有訪問localhost域, 所有向該域發(fā)送的請求中都會包含這個cookie信息cookie.setDomain("localhost");
7.5.使用HttpServletResponse的addCookie()方法, 服務器響應瀏覽器的時候把cookie發(fā)送給瀏覽器: resp.addCookie(cookie);
7.6.使用HttpServletRequest的getCookies()獲取請求中攜帶的Cookie數(shù)組: Cookie[] cookies = req.getCookies();
二. 使用Cookie獲取用戶上次登錄時間
1. 創(chuàng)建一個UseCookie的Web工程
2. 在WebContent下創(chuàng)建一個index.html
3. 編寫index.html
<!DOCTYPE html> <html><head><meta charset="UTF-8" /><title>登錄界面</title></head><body><form action="LoginFilter.action" method="post">賬號:<input type="text" name="username"/><br>密碼:<input type="text" name="password"/><br><input type="submit" value="登錄"/></form></body> </html>4. 創(chuàng)建LoginFilter.java
5. 編寫LoginFilter.java
package com.lywgames.myservlet;import java.io.IOException; import java.util.Date;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 LoginFilter extends HttpServlet {private static final long serialVersionUID = 1L;public Cookie getCookie(HttpServletRequest req, String name) {// 使用HttpServletRequest的getCookies()獲取CookieCookie[] cookies = req.getCookies();if(cookies != null){for (Cookie cookie : cookies) {if(cookie.getName().equals(name)){return cookie; }}}return null;}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");String userName = req.getParameter("username");String password = req.getParameter("password");if("admin".equals(userName) && "123".equals(password)){// 獲取lastLoginTime的CookieCookie lastLoginTime = getCookie(req, "lastLoginTime");// 如果lastLoginTime為空, 說明是第一次登錄if(lastLoginTime == null){// 創(chuàng)建一個新的cookieCookie cookie = new Cookie("lastLoginTime", String.valueOf(System.currentTimeMillis()));// 設(shè)置cookie有效期為30天cookie.setMaxAge(60 * 60 * 24 * 30); // 只有訪問/UseCookie/LoginFilter.action這個路徑地址才會帶cookiecookie.setPath("/UseCookie/LoginFilter.action");// cookie對于哪個域是有效的。cookie.setDomain("localhost");// 添加cookie, 響應給瀏覽器resp.addCookie(cookie);// 向客戶端輸出登錄信息resp.getWriter().println("歡迎您, " + userName);}else{// 向客戶端輸出登錄信息Date date = new Date(Long.parseLong(lastLoginTime.getValue()));// 更新cookielastLoginTime.setValue(String.valueOf(System.currentTimeMillis()));resp.addCookie(lastLoginTime);// // 刪除cookie, 需要關(guān)閉瀏覽器, 防止有緩存 // lastLoginTime.setValue(null); // 設(shè)置cookie為空 // lastLoginTime.setMaxAge(0); // 立即失效 // // 如果你在創(chuàng)建cookie的時候加上了路徑, 刪除cookie的時候也要帶路徑 // lastLoginTime.setPath("/UseCookie/LoginFilter.action"); // // cookie對于哪個域是有效的。 // lastLoginTime.setDomain("localhost"); // // 從新添加 // resp.addCookie(lastLoginTime);resp.getWriter().println("歡迎您, " + userName + ",上次登錄時間是:" + date);}}else{// 向客戶端輸出登錄失敗resp.getWriter().println("登錄失敗");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }6. 編寫web.xml
7. 部署運行
8. 點擊登錄, 首次登錄沒有上次登錄時間, 之后登錄有上次登錄時間
三. Cookie的安全問題
1. 由于Cookie會保存在客戶端上, 所以有安全隱患問題。還有一個問題, Cookie的大小與個數(shù)有限制。為了解決這個問題, 就出現(xiàn)了Session。
總結(jié)
以上是生活随笔為你收集整理的017_Cookie的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 016_Servlet上下文
- 下一篇: 018_Session