1. 程式人生 > 其它 >java學習之Cookie與Session

java學習之Cookie與Session

0x00前言

1.會話:一次會話中包含了多次請求和響應
2.功能:一次會話的範圍內的多次請求間,共享資料
3.方式:
(1)客戶端會話技術:cookie
(2)服務端會話技術:Session

0x01Cookie技術

0x1基礎方法

response.addCookie(cookie);向客戶端傳送Cookie
String name = c.getName();獲取客戶端發來的Cookie的鍵值對
String value = c.getValue();
Cookie[] cookies = request.getCookies();客戶端訪問的Cookie提取
cookie.setMaxAge(120);//把Cookie持久化到硬碟存貨時間為120秒後自動刪除

setMaxage(int i)

正數:將Cookie資料寫到硬碟的檔案中。持久化儲存。並指定cookie存活時間,時間到後,cookie檔案自動失效
負數:預設值
零:刪除cookie資訊
cookie.setPath("/");  //設定共享

嘗試的程式碼

@WebServlet(name = "ServletCookie1", value = "/ServletCookie1")
public class ServletCookie1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //建立cookie物件
        Cookie cookie = new Cookie("msg", "hellow");
        cookie.setMaxAge(120);
        cookie.setPath("/");  //設定共享
        response.addCookie(cookie);


    }
}

獲取Cookie程式碼

@WebServlet(name = "ServletCookie2", value = "/ServletCookie2")
public class ServletCookie2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie[] cookies = request.getCookies();
        if (cookies!=null){
            for (Cookie c:cookies){
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name+":"+value);
            }
        }

    }
}

Cookie的特點和作用

1.特點:Cookie存在客戶端瀏覽器
瀏覽器對於單個Cookie的大小有限制(4kb)已經對同一個域名下面的總Cookie有限制(20個)
2.作用:Cookie一般用於儲存少量的敏感資料
在不登入的情況下,完成伺服器對客戶端身份的識別
基於時間的Cookie判斷

@WebServlet(name = "ServletCookie3", value = "/ServletCookie3")
public class ServletCookie3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Cookie[] cookies = request.getCookies();
        ServletContext servletContext = this.getServletContext();
        response.setContentType("text/html;charset=utf-8");



        if (cookies!=null){
            for (Cookie cookie:cookies){
                String name = cookie.getName();
                if ("lasttime".equals(name)){
                    String value = cookie.getValue();
                    Date date = new Date();
                    cookie.setMaxAge(60*60*24*30);
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String format = simpleDateFormat.format(date);
                    String encode = URLEncoder.encode(format, "utf-8");
                    cookie.setValue(encode);
                    response.addCookie(cookie);
                    String value1 = cookie.getValue();
                    response.getWriter().write("歡迎回來");
                    break;
                }
            }

        }
        if (cookies==null|| equals(cookies[0].getName()!="lasttime")){
            Date date = new Date();
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String format = simpleDateFormat.format(date);
            String encode = URLEncoder.encode(format, "utf-8");
            Cookie cookie = new Cookie("lasttime",encode);
            cookie.setMaxAge(60*60*24*30);
            response.addCookie(cookie);
            response.getWriter().write("歡迎您第一次訪問");}

    }
}

0x02Session技術

1.概念:伺服器端會話技術,在一次會話間共享資料,將資料儲存在伺服器端物件中.HttpSession
2.Session是依賴於Cookie的
3:。Session方法

 request.getSession()     :獲取session物件
 
 
 session方法:
 
 Object getAttribute(String name)  
		void setAttribute(String name, Object value)
		void removeAttribute(String name)  
 

細節:
當客戶端關閉以後,伺服器關閉,兩次獲取的Seesion是不同的。

原因:在第一次獲取session的時候,伺服器會自動在記憶體中建立一個session物件,並把session的id即JSESSIONID通過cookie的形式返回給客戶端
客戶端在後續訪問的時候,都會帶著該cookie即JSESSIONID,來訪問服務端,服務端根據該id找到對應的session物件,以此來保證一次會話內的多次請求找的都是同一個session
如果客戶端關閉的話代表著會話結束了,cookie就不會再攜帶JESSIONID
 HttpSession session = request.getSession();
        System.out.println(session);
        Cookie cookie = new Cookie("JSEESSIONID",session.getId());
        cookie.setMaxAge(60*60);
        response.addCookie(cookie);
可以通過在這種給Cookie設定值和延長Cookie的時間去達到這個效果。

客戶端不關閉,伺服器關閉,兩次獲取的Seesion是不是一個值
預設的時候不是一個值,但是Tomact會實現Session的鈍化和活化,就是序列化和反序列化
如果服務端重啟後客戶端沒關如果Session發生改變的化會導致資料丟失,所有就會出現鈍化和活化
鈍化:把Session序列化到硬碟上,伺服器啟動以後將Session檔案轉化成session物件

0x03總結

Cookied的設定會造成XSS攻擊,所以出現了防禦機制HttpOnly標誌(可選),客戶端指令碼將無法訪問cookie(如果瀏覽器支援該標誌的話)。因此即使客戶端存在跨站點指令碼(XSS)漏洞,瀏覽器也不會將Cookie透露給第三方。Cookie和Session後面還會設計到xss和csrf漏洞的利用,還有Cookie注入。