本文包括:
HttpSession對象
session內(nèi)置對象
使用session實現(xiàn)訪問控制
JSP作用域
Cookie
session與Cookie的比較
小試牛刀:簡化用戶登錄
會話:當(dāng)前瀏覽器與服務(wù)器間多次的請求、響應(yīng)關(guān)系醇份,被稱作一個會話
1留量、HttpSession對象
1.1、HttpSession對象簡介
服務(wù)器為每個會話創(chuàng)建一個HttpSession對象
每個會話對象都有一個唯一的ID
把用戶的數(shù)據(jù)保存在相應(yīng)的HttpSession對象內(nèi)
第一次請求時赡勘,服務(wù)器創(chuàng)建一個HttpSession對象嫂便,并把該對象的ID返回給用戶。同時闸与,服務(wù)器在內(nèi)存中開辟一空間毙替,用來保存該對象數(shù)據(jù)。
第二次請求把ID一起發(fā)送給服務(wù)器践樱,服務(wù)器根據(jù)ID號尋找內(nèi)存中相應(yīng)的數(shù)據(jù)厂画。
1.2、HttpSession對象的存在周期
-
session的創(chuàng)建
瀏覽器訪問服務(wù)器時拷邢,服務(wù)器為每個瀏覽器創(chuàng)建不同的session對象
嚴(yán)格描述:
當(dāng)服務(wù)器端調(diào)用 HttpServletRequest.getSession() 時袱院,沒有當(dāng)前session,這時候才會創(chuàng)建一個session對象瞭稼,注意忽洛,JSP本質(zhì)是Servelt, JSP 文件在編譯成 Servlet 時將會自動加上這樣一條語句:
HttpSession session = HttpServletRequest.getSession(true);
這也是 JSP 中隱含的 session 對象的來歷环肘。
-
session的關(guān)閉
調(diào)用session. invalidate()方法欲虚,使session對象失效。
-
訪問時間間隔大于非活動時間間隔廷臼, session對象失效苍在。
換種說法:
Session 超時:超時指的是連續(xù)一定時間服務(wù)器沒有收到該 Session 所對應(yīng)客戶端的請求绝页,并且這個時間超過了服務(wù)器設(shè)置的 Session 超時的最大時間。
關(guān)閉服務(wù)器時寂恬,session對象失效
注意:關(guān)閉瀏覽器時续誉,session對象不會馬上失效。
2初肉、session內(nèi)置對象
2.1酷鸦、session內(nèi)置對象簡介
session表示客戶端與服務(wù)器的一次會話
Web中的session指:用戶在瀏覽某個網(wǎng)站時,從進入網(wǎng)站到瀏覽器關(guān)閉所經(jīng)過的這段時間牙咏,也就是用戶瀏覽網(wǎng)站所花費的時間臼隔。
從上述定義中可以看到,session實際是一個【特定的時間概念】
服務(wù)器的內(nèi)存中妄壶,保存著同用戶的session摔握。
2.2、內(nèi)置對象session的常用方法
void setAttribute(String key,Object value):以key/value的形式保存對象值
Object getAttribute(String key):通過key獲取對象值
void invalidate():設(shè)置session對象失效
String getId():獲取sessionid
void setMaxInactiveInterval(int interval):設(shè)定session的非活動時間
int getMaxInactiveInterval():獲取session的有效非活動時間(以秒為單位)
void removeAttribute(String key):從session中刪除指定名稱(key)所對應(yīng)的對象
2.3丁寄、session與窗口的關(guān)系
每個session對象都與瀏覽器一一對應(yīng)氨淌,重新開啟一個瀏覽器,相當(dāng)于重新創(chuàng)建一個session對象伊磺。
通過超鏈接打開的新窗口盛正,新窗口的session與其父窗口的session相同
3、使用session實現(xiàn)訪問控制
3.1屑埋、需求說明:
新聞發(fā)布系統(tǒng)只允許管理員能夠進入后臺操作頁面
普通用戶只有瀏覽新聞和發(fā)布評論的權(quán)限
3.2豪筝、業(yè)務(wù)分析:
登錄處理頁面
獲得登錄信息
查詢數(shù)據(jù)庫,判斷該用戶是否注冊
如果該用戶已注冊摘能,在session中保存該用戶的登錄信息
如果用戶是管理員就跳轉(zhuǎn)到管理員界面续崖;否則跳轉(zhuǎn)到新聞發(fā)布系統(tǒng)的首頁。
-
管理員界面
從session中提取該用戶信息
如果用戶信息存在徊哑,顯示管理員界面內(nèi)容
如果用戶信息不存在袜刷,跳轉(zhuǎn)到登錄頁面
3.3聪富、代碼實現(xiàn):
-
在控制頁面獲取用戶請求的登錄信息進行驗證
<% if ("admin".equals(name)&&"admin".equals(pwd){ //如果是已注冊用戶 //在session中存放用戶登錄信息 session.setAttribute("login", name); //設(shè)置session過期時間 session.setMaxInactiveInterval(10*60); //請求轉(zhuǎn)發(fā) request.getRequestDispatcher("admin.jsp") .forward(request,response); } else { response.sendRedirect("index.jsp");} %>
-
在新聞發(fā)布系統(tǒng)新聞發(fā)布頁面增加登錄驗證
<% //session.getAttribute(String key)方法的返回值是一個Object莺丑,必須進行強制類型轉(zhuǎn)換 String login = (String) session.getAttribute("login"); if (login == null){ //如果session中不存在該用戶的登錄信息,轉(zhuǎn)入登錄頁面 response.sendRedirect("index.jsp"); } %>
3.4墩蔓、優(yōu)化訪問控制:
除了首頁面梢莽,其它頁面中同樣需要加入登錄驗證,有沒有辦法避免冗余代碼的出現(xiàn)奸披?可以將一些共性的內(nèi)容寫入一個單獨的文件中昏名,然后通過include指令引用該文件。
-
創(chuàng)建登錄驗證文件 loginControl.jsp
<% String login = (String) session.getAttribute("login"); if (login == null) response.sendRedirect("index.jsp"); %>
在后臺首頁面中使用include指令引用登錄驗證文件
<%@ include file="loginControl.jsp" %>
注意:重復(fù)定義變量阵面。
4轻局、JSP作用域
作用域:信息共享的范圍
4.1洪鸭、常用作用域存/取值方法
setAttribute(String key,Object value):采用鍵/值對方式在當(dāng)前作用域中儲存數(shù)據(jù)
getAttribute(String key):以鍵(key)方式取出當(dāng)前作用域儲存的值
4.2、內(nèi)置對象名稱
-
page作用域指本JSP頁面的范圍
pageContext.setAttribute(鍵,值)
pageContext.getAttribute(鍵)
request作用域內(nèi)的對象則是與客戶端的請求綁定在一起
session對象作用域:一次會話
application的作用域:面對整個Web應(yīng)用程序
5仑扑、cookie
cookie是Web服務(wù)器保存在客戶端的一系列文本信息
5.1览爵、cookie的作用:
- 對特定對象的追蹤
- 統(tǒng)計網(wǎng)頁瀏覽次數(shù)
- 簡化登錄
5.2、安全性能:容易信息泄露
5.3镇饮、語法:
-
創(chuàng)建cookie對象
Cookie newCookie = new Cookie(String key,String value);
-
寫入cookie
response.addCookie(newCookie);
-
讀取cookie
Cookie[] cookies = request.getCookies();
5.4蜓竹、常用方法:
void setMaxAge(int expiry):設(shè)置cookie的有效期,以秒為單位
void setValue(String value):在cookie創(chuàng)建后储藐,對cookie進行賦值
String getName():獲取cookie的名稱
String getValue():獲取cookie的值
5.5俱济、Cookie的中文傳值問題
-
解答:
Version 0 cookie values are restrictive in allowed characters. It only allows URL-safe characters. This covers among others the alphanumeric characters (a-z, A-Z and 0-9) and only a few lexical characters, including -, _, ., ~ and %. All other characters are invalid in version 0 cookies.
Your best bet is to URL-encode those characters. This way every character which is not allowed in URLs will be percent-encoded in this form %xx which is valid as cookie value.
So, when creating the cookie do:
Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
// ...
And when reading the cookie, do:String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
// ... -
具體做法:
在JSP文件中
<%@page import="java.net.URLEncoder"%> ... //創(chuàng)建Cookie時 Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8")); ... //讀取Cookie時 String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
6、session與cookie的比較
session是在服務(wù)器端保存用戶信息钙勃,Cookie是在客戶端保存用戶信息
session中保存的是對象蛛碌,Cookie保存的是字符串
session隨會話結(jié)束而關(guān)閉,Cookie可以長期保存在客戶端
不重要的信息使用cookie保存辖源,重要的信息使用session保存
7左医、小試牛刀:簡化用戶登錄
7.1、需求說明:
用戶第一次登錄時需要輸入用戶名和密碼
在5分鐘內(nèi)同木,無需再次登錄則直接顯示歡迎頁面
7.2浮梢、實現(xiàn)思路:
用戶登錄后,創(chuàng)建cookie保存用戶信息
設(shè)置cookie的有效期為5分鐘
在登錄頁循環(huán)遍歷cookie數(shù)組彤路,判斷是否存在指定名稱的cookie秕硝,若存在則直接跳轉(zhuǎn)至歡迎頁面
提示:使用setMaxAge(5*60)設(shè)置cookie的有效期