Java-會話技術,Cookie,Session

會話技術

一次會話中包含多次請求和響應
一次會話:瀏覽器第一次給服務器資源發送請求,會話建立,知道有一方斷開爲止

功能: 在一次會話的範圍內的多次請求間,共享數據

方式:
1.客戶端會話技術:Cookie
2.服務器端會話技術:Session

1.Cooking

概念:客戶端會話技術,將數據保存到客戶端

快速入門
使用步驟:
1. 創建Cooking對象,綁定數據
new Cookie(String name, String value)
Cookie cookie = new Cookie(“msg”,“hello”);
2.發送Cooking對象
response.addCookie(Cookie cookie)
3.獲取Cooking,拿到數據
Cookie[ ] request.getCookies( )
cookie.getName(); //拿到cookie中的名稱
cookie.getValue(); //拿到cookie中的值

實現原理
在這裏插入圖片描述
cookie的細節:

  1. 一次可不可以發送多個cookie
    可以
    可以創建多個Cookie對象,使用response調用多次addCookie發送對象

2.cookie在瀏覽器中保存多久
1.默認情況下:當瀏覽器被關閉後,Cookie數據被銷燬
2.持久化存儲:
1.setMaxAge(int seconds)
參數:
1.正數
將Cookie數據寫到硬盤的文件中。持久化存儲
cookie存活時間。
2.負數
默認值
3.零
刪除Cookie信息

3.cookie 能不能存中文?
在TomCat 8 之前cookie 中不能直接存儲中文數據
在TomCat 8 之後cookie 中支持直接存儲中文路徑
特殊字符還是不支持 所有特殊字符還是使用URL編碼
在Tomcat 8 之前需要將中文數據轉碼 一般採用URL編碼(%E3)
1.URL編碼 將特殊字符轉成URL編碼類型
format = URLEncoder.encode(format,“utf-8”);
2.URL解碼
value = URLDecoder.decode(value,“utf-8”);

4.cookie共享問題
假設在一個tomcat服務器中,部署了多個web項目,那麼在這些web項目中cookie能不能共享
默認情況下cookie不能共享
setPath(String path): 設置cookie的獲取範圍,默認情況下,設置當前的虛擬目錄
如果需要共享,則可以將path設置爲“ / ”當前項目的根路徑
//設置path 讓當前服務器下部署的所有項目共享Cookie信息

  cookie.setPath("/");

不同的tomcat服務器間cookie共享問題?
setDomain(String path):如果設置以及域名相同,那麼多個服務器之間cookie可以共享

setDomain(".baidu.com").那麼tieba.baidu.com 和 news.baidu.com中cookie可以共享

cookie的特點和作用:

1.cookie存儲數據在客戶端瀏覽器

2.瀏覽器對於單個cookie 的大小有限制(4kb),以及對同一個域名下的總cookie數量也有限制(20個)

作用:
cookie一般用於存儲少量的不太敏感的數據
在不登錄的情況下,完成服務器對客戶端的身份識別

案例:記住上一次訪問時間
1.訪問一個Servlet,如果是第一次訪問,則提示你好,歡迎您首次訪問
2.如果不是第一次訪問,則提示:歡迎回來,您上次訪問時間爲:顯示時間字符串

分析:
1.可以採用Cookie來完成
2.在服務器中的servlet來判斷是否有一個名爲ListTime的cookie
有:非第一次訪問
響應數據
更新時間
寫回cookie
寫回cookie中 需要注意日期字符串中有無特殊字符,有特殊字符需要使用URL編碼
沒有:第一次訪問
響應數據
寫回cookie

@WebServlet("/CookieTest")
public class CookieTest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8"); //設置響應體消息的數據格式以及編碼
        boolean result = false; //是否有ListTime的值
        //獲取當前時間
        Date date = new Date();
        SimpleDateFormat simp = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");
        String format = simp.format(date);
        //URL編碼 將時間字符串中的特殊字符轉成URL編碼類型
        format = URLEncoder.encode(format,"utf-8");

        //獲取所有的cookie
        Cookie[] cookies = request.getCookies();
        //遍歷cookie
        if (cookies != null && cookies.length>0){
            for (Cookie cookie : cookies) {
                //獲取cookie的名稱
                String name = cookie.getName();
                if ("ListTime".equals(name)){
                    //有該cookie  不是第一次訪問
                    result = true;
                    //響應數據
                    String value = cookie.getValue(); //獲取cookie的value 時間
                    //URL解碼
                    value = URLDecoder.decode(value,"utf-8");
                    response.getWriter().write("歡迎回來,您上次訪問時間爲:"+value);

                    //更新時間
                    cookie.setValue(format);
                    //設置cookie的存活時間
                    cookie.setMaxAge(60*60*24*30); //存活時間
                    response.addCookie(cookie);//發送cookie
                    break;
                }
            }
        }

        if (cookies == null || cookies.length==0 || result==false){
            //首次訪問
                Cookie cookie2 = new Cookie("ListTime",format);
                cookie2.setMaxAge(60*60*24*30);
                response.addCookie(cookie2);
                response.getWriter().write("你好,歡迎您首次訪問");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

2.Session

概念:服務器端會話技術,在一次會話的多次請求間共享數據,將數據保存在服務器端的對象中。HttpSession

快速入門:
1.獲取HttpSession對象
HttpSession session = request.getSession();
2.HttpSession對象
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeValue(String name)
原理:
Session的實現 是依賴於Cookie的
在這裏插入圖片描述
細節:
1.當客戶端關閉後,服務器不關閉,兩次獲取session是否爲同一個
默認情況下不是
如果需要相同,則可以創建Cookie,鍵爲JSESSIONID 設置最大存活時間,讓cookie持久化保存

HttpSession session = request.getSession();
        //期望客戶端關閉後,session也能相同
        Cookie cookie = new Cookie("JSESSIONID",session.getId());
        cookie.setMaxAge(60*60);
        response.addCookie(cookie);

2.客戶端不關閉。服務器關閉後,兩次獲取的session是同一個嗎
不是同一個,但是要確保數據的不丟失
session的鈍化
在服務器正常關閉之前,將session對象序列化到硬盤上
session的活化
在服務器啓動後,將session文件轉化爲內存中的session對象即可

3.session什麼時間被銷燬?
1.服務器關閉
2.session對象調用invalidate()
3.session默認失效時間 30分鐘
選擇性的XML配置修改

<session-config>
	<session-timeout>30</session-timeout>
<session-config>

特點:
1.session用於存儲一次會話的多次請求的數據,存在服務器端
2.session可以存儲任意類型,任意大小的數據

session 與 Cookie的區別

1.session存儲數據在服務器端,Cookie在客戶端
2.session沒有數據大小限制,cookie有大小限制
3.session數據安全,Cookie相對不安全

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章