Web&&Servlet之會話管理入門
阿新 • • 發佈:2019-01-02
瀏覽器的請求和相應都存不了中文所以需要進行加密
URLEncoder的加密類
URLEncoder.encode(“”,"utf-8");
URLDecoder的解密類
URLDecoder.decode(str,“gdk”)
1會話管理
1.1生活中的會話: 1.2程式中的會話 一次會話:開啟瀏覽器-》訪問伺服器-》關閉瀏覽器 場景一: 開啟瀏覽器:-》訪問網站-》登陸頁面-》輸入使用者名稱和密碼(儲存會話的資訊)-》提交到後臺-》校驗成功 》》返回使用者首頁(看到當前登陸的使用者名稱資訊.....)(取出會話資訊)-》關閉瀏覽器; - 用什麼技術去儲存這些會話資訊??? 場景二: 開啟瀏覽器-》瀏覽購物網站-》點選“購買”(把商品資訊儲存下來)-》放入“購物車”-》關閉瀏覽器 開啟瀏覽器-》瀏覽購物網站-》檢視”購物車“-》看到之前商品的資訊-》付款購買-》關閉瀏覽器 使用什麼技術儲存這些商品資訊? 會話管理:瀏覽器與伺服器之間的會話過程中產生的會話資料!!! 思考: 可以使用域物件儲存會話資訊??? context域 登入:登入頁面(張三 context.setAttribute("name',"張三")) -》訪問使用者主頁(context.getAttribute("name")); 使用context域會覆蓋之前的資料 request域: 登入:登入頁面(張三 request.setAttribute("name',"張三")) -》訪問使用者主頁(request.getAttribute("name")); 使用了request域之後就必須使用轉發技術來跳轉頁面。
1.3會話管理的技術
1.Cookie技術:會話資料儲存在瀏覽器端
Session技術:會話技術是儲存在服務端
2.CooKie技術
2.1Cookie技術的使用
Cookie物件 1)建立cookie物件,用於儲存會話資料 new Cookie(name,value); 2)修改Cookie物件 void setPath(uril); void setMaxAge(int expiry); void setValue(String newValue); 3)把Cookie資料傳送給瀏覽器儲存 response.addCookie(cookie) 4)瀏覽器帶著cookie訪問伺服器,伺服器接受cookie資訊 request.getCookies();
2.2Cookie技術原理
//1)建立cookie物件,儲存會話資料, Cookie c=new Cookie("name","jack"); //2)把cookie傳送給瀏覽器,通過響應頭攜帶cookie資料給瀏覽器(set-cookie); 瀏覽器獲取cookie資料,儲存在瀏覽器快取區 response.setHeader("set-cookie","name=jack"); /** *response.addCookie(c)//簡化版本。 //3)瀏覽器在下次訪問的時候就把攜帶cookie資料,通過請求頭送給伺服器(cookie) //4)伺服器獲取瀏覽器傳送的cookie資料 String name=request.getHeader("cookie"); 簡化版本 Cookie[] cookies=request.getCookies(); if(cookies!=null){ for(Cookie cookie:cookies){ String name=cookie.getName(); String value=cookie.getValue(); } }
2.3Cookie細節
1)cookie的資料型別一定是字串,如果要傳送中文,必須先對中文進行URL加密才可以傳送
2)serPath(path);修改cookie所在的有效路徑,什麼是有效路徑?如果把該cookie設定到某個
有效路徑下,然後當瀏覽器訪問這個有效路徑的時候,才會攜帶cookie資料給伺服器。
/**
*1)設定有效路徑;預設情況下把專案設定到當前專案的根目錄下
*c.setPath("/day11");
*/
3)setMaxAge(整數);設定cookie的有效時間
正整數:表示超過了正整數的數值的時間,cookie就會丟失(cookie儲存咋瀏覽器的快取目錄)單位: 秒
負整數:表示如果瀏覽器關閉了,cookie就會丟失!(cookie儲存瀏覽器記憶體)(預設情況下)
0 :表示刪除同名的cookie
4)cookie可以有多給,但是一般允許放300個cookie,每個站點最多放20個cookie,每個Cookie的大小限制為4KB
2.4案例:使用者上次訪問的時間
package dxq.Cookie;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieDeom1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//製造當前字串
response.setContentType("text/html;charset=utf-8");
SimpleDateFormat siple = new SimpleDateFormat("yyyy年MM月dd日hh時mm分ss秒");
String data = siple.format(new Date());
//獲取cookie
Cookie[] cookies = request.getCookies();
String lastTime=null;
if(cookies!=null){
for(Cookie cookie: cookies){
//存在cookie還要繼續尋找是否name為lastTime的cookie
if(cookie.getName().equals("lastTime"));
//用lastTime儲存上次訪問的時間
lastTime=cookie.getValue();
//對日期字串進行解密
lastTime=URLDecoder.decode(lastTime,"utf-8");
response.getWriter().write("歡迎訪再次訪問本網站,上次訪問的時間為"+lastTime+"<br/>"+
"本次訪問的時間為"+data);
//更新cookie上次訪問的時間
//對中文格式進行加密
data = URLEncoder.encode(data,"utf-8");
//把時間存到cookie中
cookie.setValue(data);
//把cookie傳送給瀏覽器
response.addCookie(cookie);
break;
}
}
//第一次訪問
if(cookies==null||lastTime==null){
response.getWriter().write("歡迎首次登陸本網站,當前時間為"+data);
//對中文格式進行加密
data = URLEncoder.encode(data,"utf-8");
//把時間存到cookie中
Cookie c=new Cookie("lastTime",data);
//把cookie傳送給瀏覽器
response.addCookie(c);
}
}
}
2.5案例使用者瀏覽過的商品
3.Session技術
3.1引入
cookie特點:
1)會話資料放在瀏覽器端
2)資料型別只能string,而且有大小限制
3)相對資料存放不安全
Session特點:
1)會話資料放在伺服器端(伺服器記憶體),佔用伺服器資源。
2)資料型別任意型別,沒有大小限制
3)相對安全
3.2Session使用步驟
HttpSession物件
1)建立HttpSession物件,用於儲存會話資料
session=request.getSession():建立或獲取session物件
2)修改session物件
void setMaxInactiveInterval(int interval)設定session物件的有效時間
void invalidate() 手動銷燬session物件
3)儲存會話資料(作為域物件)
session.setAttribute(“name”,object);儲存資料
session.getAttribute(“name”);獲取資料
session。removeAttribute(“name”);刪除資料
3.3Session原理
伺服器如何區分不同的瀏覽器會話
前提:
可以從session物件取出資料,必須是存放資料的session物件
1)瀏覽器1:視窗一(001)
建立HttpSession物件
HttpSession session=request.getSession(); 給session物件分配了001
儲存會話資料
session.setAttribute(“name”,“Jack”);
2)瀏覽器1 視窗二(001)
得到session
HttpSession session=request.getSession(); 搜尋001的物件
獲取會話框
String name=(String) session。getAttribute('name"); 可以得到
3)瀏覽器2 (沒有標記或不是001)
得到session
HttpSession session=request.getSession();
獲取會話框
String name=(String) session。getAttribute('name"); 不可以得到
4)新開瀏覽器(沒有標記或不是001)
得到session
HttpSession session=request.getSession();
獲取會話框
String name=(String) session。getAttribute('name");不可以得到
1)伺服器創造了Session物件,伺服器會給這個session物件分配一個唯一的標記JSESSIONID
2)把JSESSIONID作為Cookie傳送給瀏覽器
3)瀏覽器得到JSESSIONID儲存下來,在下次訪問時攜帶這個JSESSIONID去訪問伺服器
4)伺服器得到JSESSIONID,在伺服器記憶體中搜索是否存在指定JSESSIONID的session物件
5)如果找不到,則返回這個session物件
6)如果找不到,可能直接返回null,或者在建立新的session物件
HttpSession session=request.getSession();
結論,通過JSESSIONID在伺服器中查詢對應的session物件。
3.4Session的細節
1)setMaxInactiveInterval(秒數)設定session物件的有效時間
問題:session在什麼時候銷燬?
注意:不是瀏覽器關閉,session對想就銷燬
預設情況:等待30分鐘空閒時間,session物件才會銷燬
設定全域性的session物件的過期時間
<session-config>
<session-timeout>1<session-timeout>單位是1分鐘
</session-config>
2) 可以讓JSESSIONID不讓隨著瀏覽器的關閉而丟失
設定JSESSIONID時間,不讓隨著瀏覽器的關閉而丟失
Cookie c=new Cookie(“JSESSIONID”,session.getId());
c.setMaxAge(1*30*24*60*60);//一個月
response.addC(c);
3)直接手動的銷燬session物件
session=request.getSession();
session.invalidate();
4)建立或得到session物件
request.getSession()/request.getSession(true);建立或得到session物件 查詢session物件,如果沒
有session物件則建立新的session物件
request.getSession(false); 得到session物件 查詢session物件,如果沒有session物件,直接返回null;
3.5使用者登入