Cookie&Session
會話技術
會話:一次會話中包含多次請求和響應
- 一次會話:瀏覽器第一次給服務器資源發送請求,會話建立,直到有一方斷開爲止
功能:
- 客戶端會話技術:
Cookie
- 服務器端會話技術:
Session
Cookie
-
概念:客戶端會話技術,將數據保存到客戶端
-
使用步驟:
- 創建
Cookie
對象,綁定數據new Cookie(String name,String value)
- 發送
Cookie
對象response.addCookie(Cookie cookie)
- 獲取
Cookie
對象數組,拿到數據Cookie[] request.getCookies()
- 創建
-
常用方法
方法聲明 功能描述 String getName() 獲取Cookie對象的name String getValue() 獲取Cookie對象的value void setName(String name) 設置Cookie對象的name void setValue(String value) 設置Cookie對象的value -
注意細節:
- 一次可以發送多個
Cookie
對象- 創建多個
Cookie
對象,使用response
調用多次addCookie
方法發送Cookie
對象即可
- 創建多個
Cookie
對象默認情況下保存時間爲瀏覽器關閉前Cookie
對象持久化存儲:setMaxAge(int seconds)
- seconds 是正數:將
Cookie
信息存儲到硬盤,存活seconds秒,時間到後,自動刪除Cookie
文件 - seconds 是負數:默認值
- seconds 是零:刪除
Cookie
信息
- seconds 是正數:將
Cookie
能不能存中文?- 在Tomcat 8 之前
Cookie
不能直接存儲中文數據。(需要URL編碼) - 在Tomcat 8之後
Cookie
支持中文數據,但不支持特殊字符。(建議URL編碼)
- 在Tomcat 8 之前
- 一次可以發送多個
-
Cookie
的共享問題-
同一Tomcat服務器中的
Cookie
共享問題?- 多個web項目之間的
Cookie
數據默認不能共享 setPath(String path)
:設置Cookie
的獲取範圍。默認設置爲當前的虛擬目錄,如果要共享,將 path 設置爲/
- 多個web項目之間的
-
不同Tomcat服務器中的
Cookie
共享問題?setDomain(String path)
:如果設置一級域名相同,那麼多個服務器之間的Cookie
可以共享- 例子:
setDomain(".baidu.com")
,那麼tieba.baidu.com
和news.baidu.com
中Cookie
可以共享
- 例子:
-
Cookie
的特點Cookie
存儲數據在客戶端瀏覽器- 單個
Cookie
大小有限制(4kb),同一域名下的總Cookie
數量有限制(20個)
-
Cookie
的作用Cookie
一般用於存儲少量的不太敏感的數據- 在不登錄的情況下,完成服務器對客戶端的身份識別
-
案例:記住上一次訪問時間
需求:
- 訪問一個Servlet,如果是第一次訪問,則提示:您好,歡迎您首次訪問。
- 如果不是第一次訪問,則提示:歡迎回來,您上次訪問時間爲:顯示時間字符串
Cookie
實例代碼:
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;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//設置響應的消息體的數據格式以及編碼
response.setContentType("text/html;charset=utf-8");
Cookie[] cookies = request.getCookies();
boolean flag = false;
//已經訪問過
if(cookies!=null && cookies.length>0){
for (Cookie cookie : cookies) {
String name = cookie.getName();
//判斷名稱是否是:lastTime
if("lastTime".equals(name)){
flag = true;
//設置Cookie的value
//獲取當前時間的字符串,重新設置Cookie的值,重新發送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);
//設置cookie的存活時間
cookie.setMaxAge(30);
response.addCookie(cookie);
//響應數據
//獲取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){
//設置Cookie的value
//獲取當前時間的字符串,重新設置Cookie的值,重新發送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);
//設置cookie的存活時間
cookie.setMaxAge(30);
response.addCookie(cookie);
response.getWriter().write("<h1>您好,歡迎您首次訪問</h1>");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
JSP
- 概念:java Servlet Pages:java服務器端頁面,本質上是一個
Servlet
- JSP頁面中可以同時有HTML標籤和java代碼,用於簡化書寫
-
使用方式:
方式 功能描述 <% java代碼 %>
Java代碼等效於在Service方法中執行 <%! java代碼 %>
java代碼 <%= java代碼 %>
java代碼會直接輸出到頁面上 -
JSP的內置對象:
-
在jsp頁面中的對象不需要獲取和創建,可以直接使用
-
jsp一共有9個內置對象。
-
request
-
response
-
out
:字符輸出流對象。可以將數據輸出到頁面上。out.write()
與response.getwriter()
區別:response.getWriter()
數據輸出永遠在out.write()
在前
-
-
Session
-
概念:服務器端會話技術,在一次會話的多次請求間共享數據,將數據保存在服務器端的對象中。
HttpSession
-
使用步驟:
-
獲取
HttpSession
對象:HttpSession session = request.getSession();
-
使用
HttpSession
對象:方法聲明 功能描述 Object getAttribute(String name) void setAttribute(String name,Object value) void removeAttribute(String name)
-
-
注意細節:
-
客戶端關閉後,服務器不關閉,兩次獲取的
session
是否爲同一個-
默認情況下不是同一個
-
如果需要相同,則可以創建
Cookie
,鍵爲JSESSIONID
,設置最大存活時間,讓Cookie
持久化保存。Cookie c = new Cookie("JSESSIONID",session.getID()); c.setMaxAge(60*60); response.addCookie(C);
-
-
客戶端不關閉,服務器關閉後,兩次獲取的
session
是同一個嗎?- 不是同一個,但是要確保數據不丟失。Tomcat自動完成以下工作
session
的鈍化:在服務器正常關閉之前,將session
對象系列化到硬盤上session
的活化:在服務器啓動後,將session
文件轉化爲內存中的session
對象即可。
- 不是同一個,但是要確保數據不丟失。Tomcat自動完成以下工作
-
session
什麼時候被銷燬?-
服務器關閉
-
session
對象調用invalicate()
-
session
默認失效時間30分鐘<!-- 選擇性配置修改 --> <session-config> <session-timeout>30</session-timeout> </session-config>
-
-
-
session
的特點-
session
用於存儲一次會話的多次請求的數據,存儲服務器端 -
session
可以存儲任意類型,任意大小的數據session
和Cookie
的區別:session
存儲數據在服務器端,Cookie
在客戶端session
沒有數據大小限制,Cookie
有限制session
數據安全,Cookie
相對不安全
-