Cookie&Session筆記
今日內容
1. 會話技術 1. Cookie 2. Session 2. JSP:入門學習
1
2
3
4
會話技術
1. 會話:一次會話中包含多次請求和響應。 * 一次會話:瀏覽器第一次給服務器資源發送請求,會話建立,直到有一方斷開為止 2. 功能:在一次會話的范圍內的多次請求間,共享數據 3. 方式: 1. 客戶端會話技術:Cookie 2. 服務器端會話技術:Session
1
2
3
4
5
6
Cookie:
1. 概念:客戶端會話技術,將數據保存到客戶端 2. 快速入門: * 使用步驟: 1. 創建Cookie對象,綁定數據 * new Cookie(String name, String value) 2. 發送Cookie對象 * response.addCookie(Cookie cookie) 3. 獲取Cookie,拿到數據 * Cookie[] request.getCookies() 3. 實現原理 * 基于響應頭set-cookie和請求頭cookie實現 4. cookie的細節 1. 一次可不可以發送多個cookie? * 可以 * 可以創建多個Cookie對象,使用response調用多次addCookie方法發送cookie即可。 2. cookie在瀏覽器中保存多長時間? 1. 默認情況下,當瀏覽器關閉后,Cookie數據被銷毀 2. 持久化存儲: * setMaxAge(int seconds) 1. 正數:將Cookie數據寫到硬盤的文件中。持久化存儲。并指定cookie存活時間,時間到后,cookie文件自動失效 2. 負數:默認值 3. 零:刪除cookie信息 3. cookie能不能存中文? * 在tomcat 8 之前 cookie中不能直接存儲中文數據。 * 需要將中文數據轉碼---一般采用URL編碼(%E3) * 在tomcat 8 之后,cookie支持中文數據。特殊字符還是不支持,建議使用URL編碼存儲,URL解碼解析 4. cookie共享問題? 1. 假設在一個tomcat服務器中,部署了多個web項目,那么在這些web項目中cookie能不能共享? * 默認情況下cookie不能共享 * setPath(String path):設置cookie的獲取范圍。默認情況下,設置當前的虛擬目錄 * 如果要共享,則可以將path設置為"/" 2. 不同的tomcat服務器間cookie共享問題? * setDomain(String path):如果設置一級域名相同,那么多個服務器之間cookie可以共享 * setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享 5. Cookie的特點和作用 1. cookie存儲數據在客戶端瀏覽器 2. 瀏覽器對于單個cookie 的大小有限制(4kb) 以及 對同一個域名下的總cookie數量也有限制(20個) * 作用: 1. cookie一般用于存出少量的不太敏感的數據 2. 在不登錄的情況下,完成服務器對客戶端的身份識別 6. 案例:記住上一次訪問時間 1. 需求: 1. 訪問一個Servlet,如果是第一次訪問,則提示:您好,歡迎您首次訪問。 2. 如果不是第一次訪問,則提示:歡迎回來,您上次訪問時間為:顯示時間字符串 2. 分析: 1. 可以采用Cookie來完成 2. 在服務器中的Servlet判斷是否有一個名為lastTime的cookie 1. 有:不是第一次訪問 1. 響應數據:歡迎回來,您上次訪問時間為:2018年6月10日11:50:20 2. 寫回Cookie:lastTime=2018年6月10日11:50:01 2. 沒有:是第一次訪問 1. 響應數據:您好,歡迎您首次訪問 2. 寫回Cookie:lastTime=2018年6月10日11:50:01 3. 代碼實現: package cn.itcast.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("/cookieTest") public class CookieTest extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置響應的消息體的數據格式以及編碼 response.setContentType("text/html;charset=utf-8"); //1.獲取所有Cookie Cookie[] cookies = request.getCookies(); boolean flag = false;//沒有cookie為lastTime //2.遍歷cookie數組 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;//有lastTime的cookie //設置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(60 * 60 * 24 * 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("
歡迎回來,您上次訪問時間為:"+value+"
"); 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(60 * 60 * 24 * 30);//一個月 response.addCookie(cookie); response.getWriter().write("您好,歡迎您首次訪問
"); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
JSP:入門學習
1. 概念: * Java Server Pages: java服務器端頁面 * 可以理解為:一個特殊的頁面,其中既可以指定定義html標簽,又可以定義java代碼 * 用于簡化書寫!!! 2. 原理 * JSP本質上就是一個Servlet 3. JSP的腳本:JSP定義Java代碼的方式 1. <% 代碼 %>:定義的java代碼,在service方法中。service方法中可以定義什么,該腳本中就可以定義什么。 2. <%! 代碼 %>:定義的java代碼,在jsp轉換后的java類的成員位置。 3. <%= 代碼 %>:定義的java代碼,會輸出到頁面上。輸出語句中可以定義什么,該腳本中就可以定義什么。 4. JSP的內置對象: * 在jsp頁面中不需要獲取和創建,可以直接使用的對象 * jsp一共有9個內置對象。 * 今天學習3個: * request * response * out:字符輸出流對象。可以將數據輸出到頁面上。和response.getWriter()類似 * response.getWriter()和out.write()的區別: * 在tomcat服務器真正給客戶端做出響應之前,會先找response緩沖區數據,再找out緩沖區數據。 * response.getWriter()數據輸出永遠在out.write()之前 5. 案例:改造Cookie案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Session:主菜
1. 概念:服務器端會話技術,在一次會話的多次請求間共享數據,將數據保存在服務器端的對象中。HttpSession 2. 快速入門: 1. 獲取HttpSession對象: HttpSession session = request.getSession(); 2. 使用HttpSession對象: Object getAttribute(String name) void setAttribute(String name, Object value) void removeAttribute(String name) 3. 原理 * Session的實現是依賴于Cookie的。 4. 細節: 1. 當客戶端關閉后,服務器不關閉,兩次獲取session是否為同一個? * 默認情況下。不是。 * 如果需要相同,則可以創建Cookie,鍵為JSESSIONID,設置最大存活時間,讓cookie持久化保存。 Cookie c = new Cookie("JSESSIONID",session.getId()); c.setMaxAge(60*60); response.addCookie(c); 2. 客戶端不關閉,服務器關閉后,兩次獲取的session是同一個嗎? * 不是同一個,但是要確保數據不丟失。tomcat自動完成以下工作 * session的鈍化: * 在服務器正常關閉之前,將session對象系列化到硬盤上 * session的活化: * 在服務器啟動后,將session文件轉化為內存中的session對象即可。 3. session什么時候被銷毀? 1. 服務器關閉 2. session對象調用invalidate() 。 3. session默認失效時間 30分鐘 選擇性配置修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
案例:驗證碼
1. 案例需求: 1. 訪問帶有驗證碼的登錄頁面login.jsp 2. 用戶輸入用戶名,密碼以及驗證碼。 * 如果用戶名和密碼輸入有誤,跳轉登錄頁面,提示:用戶名或密碼錯誤 * 如果驗證碼輸入有誤,跳轉登錄頁面,提示:驗證碼錯誤 * 如果全部輸入正確,則跳轉到主頁success.jsp,顯示:用戶名,歡迎您 2. 分析:
1
2
3
4
5
6
7
8
9
Java JSP
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。