# 什么是會話
用戶開一個瀏覽器訪問一個網站,只要不關閉該瀏覽器,不管該用戶點擊多少個超鏈接,訪問多少資源.直到用戶關閉瀏覽器,或者服務器關閉,這整個過程我們稱作一次會話.
# cookie
## 工作原理
* 瀏覽器訪問服務器,服務器產生鍵值對形式的cookie.
* 通過響應(響應頭set-cookie)返回給瀏覽器.
* cookie保存在瀏覽器上,下次訪問服務器的時候根據一定的規則攜(指的就是cookie的路徑)帶不同的cookie,通過請求(請求頭cookie)攜帶,服務器就可以拿到這些cookie.
* cookie不支持中文.
* cookie不能跨瀏覽器.
* cookie銷毀后會刪除所有保存在里面的數據.
## 設置cookie
~~~
//創建cookie
Cookie cookie = new Cookie("name", "jack");
//寫回瀏覽器
response.addCookie(cookie);
~~~
## 獲取cookie
* 獲取cookie的名稱:getName().
* 獲取cookie的value:getValue().
~~~
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if ("name".equals(c.getName())) {
System.out.println(c.getValue());
}
}
}
~~~
## 設置cookie在瀏覽器端的存活時間和路徑
* 單位是秒,如果秒數為0,則刪除cookie(前提是,必須路徑相同).
* 默認路徑: 從根路徑到最后一個"/" 結束. 如在"/dome/user/login" 路徑下設置的cookie,默認路徑是"/dome/user"
* 同一路徑下不能有重名的cookie,否則會被覆蓋.
* 當方位的URL包含此cookie的path的時候就會攜帶這個cookie,反之不會.
假如cookie路徑是/aa/bb/cc,那么訪問/aa/bb/cc/dd,/aa/bb/cc是會攜帶這個cookie的,如果訪問/aa/bb或者/cc/dd是不會攜帶這個cookie的.
~~~
cookie1.setMaxAge(300); //單位是秒,這里是5分鐘
cookie1.setPath("/user/login"); //設置cookie的路徑
~~~
~~~
Cookie cookie1 = new Cookie("akey", "avalue");
Cookie cookie2 = new Cookie("bkey", "bvalue");
Cookie cookie3 = new Cookie("ckey", "cvalue");
Cookie cookie4 = new Cookie("ckey", "dvalue");
//設置cookie的路徑(注意:同一路徑下不能有重名的cookie,有的話會被覆蓋,不同路徑下可以有重名的cookie)
cookie3.setPath(request.getContextPath()+"/user/register");
response.addCookie(cookie1);
response.addCookie(cookie2);
response.addCookie(cookie3);
response.addCookie(cookie4);
~~~
訪問/dome/user/info 可以獲取1,2,4的cookie. 訪問/dome/user可以獲取1,2,3,4的cookie.訪問/dome/user/register可以獲取1,2,3,4的cookie.
## 刪除cookie
1. new 一個新cookie,路徑和name和要刪除的cookie一致,max-age 設置為0,寫回瀏覽器即可進行刪除.
# session
## 工作原理
1. 瀏覽器向服務器發送請求.
2. 服務器判斷瀏覽是否攜帶了唯一標識.
3. 若有標識:服務器去查詢session池中是否有對應的標識.若有:直接操作session對象,并把它存入瀏覽器.若無:服務器會為其創建一個私有的內存空間,可以操作session,把它存放到瀏覽器端.
4. 若無標識:服務器會為其創建一個私有的內存空間,可以操作session,把它存放到瀏覽器端(依賴cookie).
5. 創建時機:第一次調用request.getSession()的時候.
6. 銷毀時機: 1.服務器非正常關閉(正常關閉不會丟). 2.超時銷毀:tomcat默認是30分鐘. 3.手動銷毀.
sessionid是保存在cookie中的,如果cookie沒有設置存活時間,那么每當瀏覽器關閉之后重新打開這個網頁會創建一個新的sessionid.如果cookie設置了存活時間,那么就會保留這個sessionid.
## 方法
獲取session
~~~
HttpSession session = request.getSession();
~~~
獲取sessionID
~~~
session.getId();
~~~
設置session存活時間
~~~
session.setMaxInactiveInterval(秒);
~~~
# 實例
## 獲取上次訪問時間
~~~
response.setContentType("text/html;charset=utf-8");
Cookie[] cookies = request.getCookies();
Cookie co = null;
if (cookies != null) {
//查找cookie
for (Cookie c : cookies) {
if ("lastTime".equals(c.getName())) {
co = c;
}
}
}
//判斷是否存在cookie
if (co != null) {
response.getWriter().print("您上次的訪問時間為:" + co.getValue());
} else {
response.getWriter().print("歡迎訪問");
}
DateFormat dateInstance = DateFormat.getDateInstance();
String format = dateInstance.format(new Date());
Cookie cookie = new Cookie("lastTime", format);
cookie.setMaxAge(3600);
response.addCookie(cookie);
~~~
- 環境
- Java基礎
- 數據類型
- 基本類型
- 引用類型
- Array
- Class
- ArrayList
- 流程控制
- ASCII碼表
- 面向對象
- 概述
- 變量
- this
- 修飾符
- 封裝
- 繼承
- final
- static
- 接口
- 接口
- 抽象類
- overload
- 接口和抽象類區別
- 案例
- 多態
- 構造方法
- super
- 匿名對象
- 內部類
- 靜態導入
- 包的聲明和訪問
- 代碼塊
- 代理設計模式
- 靜態代碼塊
- Object類
- lambda表達式
- 枚舉
- 定義枚舉
- 常用方法
- 枚舉常量
- 異常
- 可變參數
- Properties
- 概述
- Properties和持久化有關的方法
- 反射
- 類加載器
- 概述
- Class類
- 獲取構造方法并運行
- 獲取成員變量并改值
- 獲取成員方法并運行
- 反射泛型擦除
- 反射通過配置文件運行
- 常用 API
- Date類
- DateFormat類
- Calendar類
- Math類
- String類
- object類
- System類
- 正則表達式
- BigInteger類
- BigDecimal類
- Arrays工具類
- StringBuffer類
- 基本類型包裝類
- 自動裝箱和自動拆箱
- 框架集合
- collection接口
- 概述
- 接口方法
- 迭代器
- 迭代器并發異常
- 增強for循環
- 泛型
- hashCode和equals
- List接口
- 概述
- ArrayList
- LinkedList
- vector
- Set接口
- 概述
- 對象的哈希值
- HashSet
- LinkedHashSet
- 保證自定義元素的唯一性(重寫)
- ArrayList和HashSet的contains原理
- Map接口
- 概述
- Map集合常用方法
- 迭代Map
- Map存儲自定義類型
- HashMap
- LinkedHashMap
- Hashtable
- 嵌套Map遍歷
- 方法的可變參數
- collections工具類
- 集合嵌套
- 集合特點總結
- Collection集合工具類
- Arrays工具類
- File類
- 概述
- 獲取方法
- 創建和刪除
- 判斷方法
- 其他方法
- 文件過濾器
- IO流
- 字節流
- 概述
- 字節流
- 字節流復制文件
- 字節緩沖流
- 復制單級文件夾
- 使用字節流讀取中文的亂碼問題
- 字符編碼表
- 方便程序員的IO流
- 轉換流
- 概述
- OutputStreamWriter類
- InputStreamWriter類
- 轉換流和其他子類的區別
- 序列化流
- 概述
- 序列化接口以及版本號問題
- transient
- 打印流
- 多線程
- 概述
- main線程介紹
- 開啟線程方式一:Thread類
- 開啟線程方式二:Runnable類
- 線程的執行原理
- 使用哪種方式好
- 使用匿名內部類創建線程
- 線程安全
- ThreadLocal
- 網絡編程
- XML
- 概述
- 語法
- 元素標簽
- 屬性
- 轉義字符
- CDATA區
- XML約束
- DTD約束
- 三種引入DTD的方式
- DTD語法
- Schema約束
- JDBC
- 概述
- JDBC原理
- JDBC查詢操作
- JDBCUtils
- 預處理對象
- JDBC連接池
- 概述
- DBCP
- C3P0
- DBUtils操作
- ArrayHandler
- ArrayListHandler
- BeanHandler
- BeanListHandler
- ColumnListHandler
- MapHandler
- MapListHandler
- ScalarHandler
- 事務
- 事務概述
- 原生JDBC完成轉賬
- DBUtils完成轉賬
- 事務特性
- 三層思想
- 概述
- JavaWEB
- tomcat
- servlet
- 概述
- 映射servlet
- Servlet接口
- HttpServlet類
- load-on-startup
- servletContext
- ServletRequest
- ServletResponse
- Cooike&Session
- servlet三大域對象
- JSP
- 概述
- jsp內置對象
- 指令
- page
- include
- taglib
- JSP中的四個域對象
- jsp的一個動作標簽
- EL表達式
- 概述
- 獲取域中數據
- 執行運算
- el表達式中的內置對象
- jsti標簽
- 概念
- jstl分類
- Filter過濾器
- 概述
- 生命周期
- url-pattern配置
- filter的chain過濾鏈
- filter-mapping子標簽
- 全局統一錯誤頁面
- filterConfig
- 自動登錄實例
- 全局統一編碼
- Listener監聽器
- 概念
- 監聽器分類
- 監聽三個對象的創建和銷毀
- 監聽三個對象屬性的變化
- 監聽javabean在session中的狀態變化
- 定時器
- 概念
- calendar日歷
- 郵件
- 概述
- JSON
- 數據結構
- 堆棧結構
- 隊列結構
- 數組結構
- 鏈表結構
- 基礎加強
- 面試題:增強一個對象的方法有幾種方式?
- 裝飾者增強
- 動態代理
- 動態代理
- 動態代理細節
- 使用動態代理解決字符集編碼
- 注解
- 概述
- 擴展的自定義注解
- 類加載器
- 全盤負責托管機制
- 開發模式
- 問題
- lambda
- 函數式編程思想概述
- String字符串