cookie和session
一、會話跟蹤技術(shù)
會話:用戶打開瀏覽器,訪問web服務(wù)器的資源,會話建立,直到有一方斷開連接,會話結(jié)束。在一次會話中可以包含多次請求和響應(yīng)。
會話跟蹤:一種維護(hù)瀏覽器狀態(tài)的方法,服務(wù)器需要識別多次請求是否來自于同一瀏覽器,以便在同一次會話的多次請求間共享數(shù)據(jù)。實現(xiàn)方式有:Cookie(客戶端會話跟蹤技術(shù))、Session(服務(wù)端會話跟蹤技術(shù))
二、Cookie
基本使用
Cookie:客戶端會話技術(shù),將數(shù)據(jù)保存到客戶端,以后每次請求都攜帶Cookie數(shù)據(jù)進(jìn)行訪問.
- 發(fā)送cookie
package com.ithecheng.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//發(fā)送cookie
//1.創(chuàng)建cookie對象
Cookie cookie = new Cookie("username","zs");
//2.發(fā)送cookie,response
response.addCookie(cookie);
}
}
- 獲取cookie
package com.ithecheng.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/bServlet")
public class BServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取cookie
//1. 獲取cookie數(shù)組
Cookie[] cookies = request.getCookies();
//2. 遍歷數(shù)組
for (Cookie cookie : cookies) {
//3. 獲取數(shù)據(jù)
String name = cookie.getName();
if ("username".equals(name)){
String value = cookie.getValue();
System.out.println(name + ":" + value);
break;
}
}
}
}
cookie原理
cookie是通過http協(xié)議實現(xiàn)的,服務(wù)器通過響應(yīng)頭set-cookie給瀏覽器cookie數(shù)據(jù),瀏覽器通過請求頭cookie攜帶cookie數(shù)據(jù)訪問服務(wù)器。
cookie使用細(xì)節(jié)
- cookie存活時間:默認(rèn)情況下,cookie存儲在瀏覽器內(nèi)存中,當(dāng)瀏覽器關(guān)閉,內(nèi)存釋放,cookie被銷毀。除此之外,可以使用setMaxAge(int seconds)設(shè)置cookie存活時間
package com.ithecheng.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//發(fā)送cookie
//1.創(chuàng)建cookie對象
Cookie cookie = new Cookie("username","zs");
//設(shè)置存活時間 一周
cookie.setMaxAge(60*60*24*7); //正數(shù) 存儲的時間;負(fù)數(shù) 默認(rèn)值,存在內(nèi)存中;零 刪除對應(yīng)cookie
//2.發(fā)送cookie,response
response.addCookie(cookie);
}
}
- cookie存儲中文
cookie不能直接存儲中文,如需要存儲,則需要進(jìn)行轉(zhuǎn)碼:URL編碼
cookie存儲中文時轉(zhuǎn)碼:
package com.ithecheng.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//發(fā)送cookie
//1.創(chuàng)建cookie對象
// Cookie cookie = new Cookie("username","zs");
String value = "張三";
value = URLEncoder.encode(value, "UTF-8");
System.out.println("存儲數(shù)據(jù):"+ value);
Cookie cookie = new Cookie("username",value);
//設(shè)置存活時間 一周
cookie.setMaxAge(60*60*24*7); //正數(shù) 存儲的時間;負(fù)數(shù) 默認(rèn)值,存在內(nèi)存中;零 刪除對應(yīng)cookie
//2.發(fā)送cookie,response
response.addCookie(cookie);
}
}
解析cookie的中文:
package com.ithecheng.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
@WebServlet("/bServlet")
public class BServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取cookie
//1. 獲取cookie數(shù)組
Cookie[] cookies = request.getCookies();
//2. 遍歷數(shù)組
for (Cookie cookie : cookies) {
//3. 獲取數(shù)據(jù)
String name = cookie.getName();
if ("username".equals(name)){
String value = cookie.getValue();
//URL解碼
value = URLDecoder.decode(value,"UTF-8");
System.out.println(name + ":" + value);
break;
}
}
}
}
session
基本使用
session:服務(wù)端會話跟蹤技術(shù),將數(shù)據(jù)保存到服務(wù)端(JavaEE提供HttpSession接口,來實現(xiàn)一次會話多次請求間數(shù)據(jù)共享)
- session中存儲數(shù)據(jù)
package com.ithecheng.web.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/demo1")
public class Sessiondemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 存儲數(shù)據(jù)到session中
// 1. 獲取session對象
HttpSession session = request.getSession();
// 2. 存儲數(shù)據(jù)
session.setAttribute("username","zs");
}
}
- session中獲取數(shù)據(jù)
package com.ithecheng.web.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/demo2")
public class Sessiondemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 從session中獲取數(shù)據(jù)
// 1. 獲取session對象
HttpSession session = request.getSession();
// 2. 獲取數(shù)據(jù)
Object username = session.getAttribute("username");
System.out.println(username);
}
}
session原理
session實現(xiàn)是基于cookie的

浙公網(wǎng)安備 33010602011771號