java學習之Cookie與Session
阿新 • • 發佈:2022-05-19
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注入。