什么是Session
Session技術(shù)是將信息保存在服務(wù)端,而客戶端需要接收、記錄和回送Session的ID,所以Session通常情況下是借助Cookie技術(shù)來傳遞ID給服務(wù)端的,服務(wù)端拿到session id之后查詢內(nèi)存中對應(yīng)的記錄。
一個(gè)客戶端對應(yīng)一個(gè)Session,而一個(gè)Session有多個(gè)Attribute,每一個(gè)Attribute有唯一的name。
編寫代碼證明提出的觀點(diǎn):
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
PrintWriter writer = resp.getWriter();
// 給session綁定一個(gè)user對象
session.setAttribute("user", new User(1, "kongsam"));
List<String> users = new ArrayList<>();
users.add("kongsam");
users.add("xiaoming");
users.add("xiaohong");
// 給session綁定一個(gè)list數(shù)組
session.setAttribute("list", users);
// 最后打印輸出
writer.println("JSESSIONID = " + session.getId());
writer.println("object => user = " + session.getAttribute("user").toString());
for (String user : users) {
writer.println("list => user = " + user);
}
}
兩個(gè)不同的瀏覽器就是兩個(gè)不同的客戶端,這兩個(gè)客戶端對應(yīng)不同的JSESSIONID。
Cookie的工作原理以及講解請見://www.jb51.net/article/212734.htm
Session如何工作
在現(xiàn)實(shí)生活中,當(dāng)你去理發(fā)店理發(fā)時(shí),你可以選擇在前臺(tái)辦理一張會(huì)員卡,前臺(tái)工作人員將你的基本信息和之后的消費(fèi)信息等都存儲(chǔ)到店家電腦的硬盤上,在以后消費(fèi)的時(shí)候你僅憑一張會(huì)員卡就可以查詢到你所有的信息和消費(fèi)記錄。注意,這里的你是指客戶端,前臺(tái)(店家)指的是服務(wù)端。
結(jié)合代碼理解Session
SessionDemo01是用來創(chuàng)建一個(gè)假的數(shù)據(jù)庫,并且把這個(gè)數(shù)據(jù)庫存放到Session中進(jìn)行保管。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
// 創(chuàng)建一個(gè)假數(shù)據(jù)庫
Map<String, VipUser> vipUsers = new HashMap<>();
vipUsers.put("kongsam", new VipUser(1, "kongsam", "123", 50));
vipUsers.put("xiaoming", new VipUser(2, "xiaoming", "123", 100));
vipUsers.put("xiaohong", new VipUser(3, "xiaohong", "123", 200));
// 將假數(shù)據(jù)庫的數(shù)據(jù)存放到Session中
session.setAttribute("vipUsers", vipUsers);
}
然后SessionDemo02用于訪問Session里vipsUsers數(shù)據(jù)庫,如果用戶沒有辦理或者不存在該用戶則為其注冊一個(gè)新VIP。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
HttpSession session = req.getSession();
// 獲取username
String username = req.getParameter("username");
// 從Session中取出數(shù)據(jù)庫
Map<String, VipUser> maps = (Map<String, VipUser>) session.getAttribute("vipUsers");
// 判斷數(shù)據(jù)庫中是否有和username匹配的用戶
if (maps.get(username) != null && maps.get(username).getUsername().equals(username)) {
resp.getWriter().println(maps.get(username).getUsername() + "您好,您目前的積分是: " + maps.get(username).getPoints());
} else {
resp.getWriter().println("您還沒有辦理會(huì)員卡,前臺(tái)正在為您辦理中...,請刷新頁面。");
maps.put(username, new VipUser(1, username, "123", 50));
session.setAttribute("vipUsers", maps);
}
}
來看看效果吧!
以上就是Java Web會(huì)話技術(shù)Session的簡單使用的詳細(xì)內(nèi)容,更多關(guān)于Java Session的使用的資料,請關(guān)注W3Cschool其它相關(guān)文章!