SỬ DỤNG CÁC FIELD ẨN HIDDEN FIELDS• Kỹ thuật này vẫn còn thông dụng và được áp dụng bằng cách nhúng thông tin vàotrang web cho client bằng các thẻ HIDDEN theo cú pháp: • Nhược điểm: Dù
Trang 1BÀI 6 QUẢN LÝ SESSION
ThS Phan Thanh Toàn
Trang 2TÌNH HUỐNG DẪN NHẬP
Nam đang cần thiết kế Website thương mại và đang cần tạo một giỏ hàng cho phépngười sử dụng có thể chọn các sản phẩm và lưu lại các thông tin về sản phẩm đã chọn.Yêu cầu mỗi người sử dụng cần có một danh mục các sản phẩm riêng rẽ và được lưutrữ lại trong suốt phiên làm việc trên site của khách hàng đó
Trang 3MỤC TIÊU
Trình bày được khái niệm về session và cookie
Trình bày được cách tạo và duy trì session
Trình bày được các phương pháp theo dõi và quản lý session
Vận dụng được session vào việc lưu trữ các dữ liệu trong các trang JSP
Trang 51 GIỚI THIỆU
• HTTP là protocol không trạng thái (stateless protocol), nghĩa là server khi tiếp nhậnmột yêu cầu sẽ trả về một đáp ứng rồi cắt kết nối, không lưu trữ thông tin trạng thái
về yêu cầu vừa qua Server xử lý độc lập theo từng yêu cầu từ client
• Làm sao biết được một user đã vào Website của ta hay chưa?
• Làm sao theo dõi một user để không cho phép user truy cập những thông tin “nhạycảm”?
→ Thông qua session, người phát triển web làm được điều trên
Trang 62 SESSION LÀ GÌ?
• Định nghĩa - Cấu trúc thông tin của một session;
• Khởi tạo và duy trì session;
• Cơ chế quản lý session trong server
Trang 72.1 ĐỊNH NGHĨA – CẤU TRÚC THÔNG TIN CỦA MỘT SESSION
• Session: Chuỗi các giao tiếp của một client riêng biệt với một server trong mộtkhoảng thời gian (Mỗi khi một người sử dụng vào thăm website sẽ tạo ra mộtsession)
• Một session được xem như là một đối tượng được lưu trong server cho phép ứngdụng (JSP, servlet) truy xuất giúp truy cập được thông tin về phiên làm việc củaclient
• Một đối tượng session là một danh sách <Key, Value> Trong đó, Key là tên khóa(AttributeName) cho một thuộc tính của session này, Value tham khảo tới đối tượngchứa dữ liệu của Key này
Trang 82.2 KHỞI TẠO VÀ DUY TRÌ SESSION
Một session được một client khởi tạo (khi user lần đầu tiên đưa một request cho mộtWebsite) và được nhận diện bằng một Session_ID và tồn tại khi các yêu cầu sau đâycòn thỏa mãn:
1 User không đóng browser
2 User không log-out khỏi web site
3 Có một số giao tiếp giữa user và Website Tuy nhiên, nếu user không tương tác gìvới Website thì sau một thời khoảng (thường là 30 phút - admin ấn định bênserver) session sẽ bị đóng
Trang 92.3 CƠ CHẾ QUẢN LÝ SESSION TRONG SERVER
Server có một bảng băm (hash table) ở mức cao nhất chứa các entry là các cặp <Key,Value> với Key=session_ID cho tất các các session hiện hành Mỗi Value lại chỉ tới mộtbảng băm quản lý một đối tượng session cho một client
Bảng quản lý các session Bảng quản lý một session cho một client
Trang 10CÂU HỎI THẢO LUẬN
Session là gì?
Trang 113 CÁC CƠ CHẾ THƯỜNG DÙNG ĐỂ THEO DÕI SESSION
Quan niệm về duy trì trạng thái giữa các yêu cầu khác nhau được gọi là “theo dõisession - session tracking” Có một số kỹ thuật giúp theo dõi session:
1 Sử dụng thông tin HTTP (HTTP information)
2 Sử dụng các field ẩn (Hidden fields)
3 Sử dụng các thông tin thêm từ đường dẫn truy cập và kỹ thuật ghi lại URL
4 Sử dụng các cookies
Trang 123.1 SỬ DỤNG HTTP INFORMATION
• Kỹ thuật này sẽ bẫy (trap) các thông tin trong phần header của HTTP như: E-mailheader, thông tin về IP của client (IP address, địa chỉ internet, dữ liệu 32 bit) Tuynhiên, với thời gian, kỹ thuật này trở nên lỗi thời do user sử dụng proxy server (máytrạm trong một mạng LAN) làm IP address thay đổi, khó hiện thực khả năng bảomật
• Bản chất của kỹ thuật này là mỗi khi client truy cập Website, địa chỉ IP của clientđược lưu lại để theo dõi Trong mạng LAN, mọi máy trong mạng đều có chung một
IP (chỉ có máy LAN server mới kết nối Internet, máy được ủy nhiệm - proxy) do vậykhông thể phân biệt 2 client trong một mạng LAN khi cả 2 máy cùng truy cậpInternet
Trang 133.2 SỬ DỤNG CÁC FIELD ẨN (HIDDEN FIELDS)
• Kỹ thuật này vẫn còn thông dụng và được áp dụng bằng cách nhúng thông tin vàotrang web cho client bằng các thẻ HIDDEN theo cú pháp:
<INPUT TYPE=”HIDDEN” NAME=”objectName” VALUE=”value”>
• Nhược điểm: Dù user không thấy được nội dung khi xem trong trình duyệt nhưnguser xem được nội dung ẩn này khi xem dạng code của trang → mất tính bảo mật
Trang 143.3 SỬ DỤNG THÔNG TIN THÊM TỪ ĐƯỜNG DẪN VÀ GHI LẠI URL
• Kỹ thuật này được áp dụng bằng cách thêm các thông tin vào các liên kết (thẻ <Ahref…>) Sau đó, sử dụng PATH-INFO header để trích thông tin này ra
• Ví dụ:
Thay: <a href=”/myJSPpage.jsp”> Next </a>
bằng: <a href=”/myJSPpage.jsp?login=”John”&Item=”book1”> Next </a>
Để khi user kích Next, thông tin là cặp <”John”,”book1”> được truyền cho tàinguyên được truy cập là myJSPpage.jsp TRong tập tin JSP này, các tham sốlogin và Item được truy cập
Trang 15• Một số Web Server gửi cookie cho client có xem xét đến trạng thái của client.
• Thiết lập cookie: Bằng cách thiết lập Set-Cookie header trong đáp ứng HTTP theo cúpháp sau:
Set-Cookie: Name=VALUE; expires=DATE; path= PATH;
Ví dụ:
Set-Cookie: CUSTOMER=ROOMY;
path=/;
expires=Friday, 20-Jan-2006 22:30:00 GMT;
Trang 163.4 SỬ DỤNG COOKIES (tiếp theo)
• Expires: Tham số chỉ định ngày hết hiệu lực (expiry date) của cookie này
• Thường các trình duyệt sẽ lưu các thông tin về cookie thành các tệp tin nếu cookie
có gán ngày hết hạn
• Nếu cookie không lưu ngày hết hạn thì cookie chỉ được lưu trong bộ nhớ
• Nhược điểm của cookie:
User có quyền chấp nhận cookie hay không Do vậy, nếu user không chấp nhậncookie, server sẽ thất bại khi cần nhận diện user
Trình duyệt cũng có thể không chấp nhận cookie
Không thể thiết lập kích thước cookie quá lớn, thường chỉ 4KB và không vượtquá 20 cookies cho một domain
Trang 173.4 SỬ DỤNG COOKIES (tiếp theo)
Thiết lập chế độ cookie trong Internet Explorer:
Trang 18CÂU HỎI THẢO LUẬN
Nêu cú pháp để tạo cookie?
Trang 194 CÁC CƠ CHẾ THEO DÕI SESSION TRONG JSP
• Đối tượng session được JSP engine dùng để chia sẻ thông tin về user giữa các tàinguyên mà user này truy cập Nói cách khác, đối tượng session chính là cách để ghinhớ lại trạng thái của các Website HTTP không trạng thái
• Mặc định, các trang JSP sẽ truy xuất đối tượng ngầm session này Cách cơ bản màJSP engine sử dụng để theo dõi một session như sau:
Client gửi một request tới server;
Server gửi một cookie cho client với thông tin: <Session_ID,
Current_Browser_ID>;
Khi client gửi thêm request đến server, cookie được đính vào HTTP requestheader Server truy xuất header để kiểm tra và chọn ra đối tượng session phùhợp với user này;
Nếu client mở mới một cửa sổ browser (chạy lại trình duyệt) thì một đối tượngsession mới được khởi tạo Tuy nhiên, nếu user lại mở một cửa sổ mới từbrowser đang hoạt động hiện hành thì hai cửa sổ của client cùng dùng chungmột session
Trang 204 CÁC CƠ CHẾ THEO DÕI SESSION TRONG JSP (tiếp theo)
• Hai phương pháp chính thường dùng để quản lý session trong JSP
Theo dõi session bằng cookie (using cookie)
• JSP và servlet quản lý cookie thông qua lớp javax.servlet.http.Cookie Lớp này cungcấp nhiều method giúp quản lý cookie
• Các phương thức chính của lớp cookie:
Cookie(String name, String value): Tạo 1 cookie với <name,value>;
Ví dụ: Tạo một cookie lưu xâu kí tự Hello how are you? Và sau đó lấy lại thôngtin trong cookie và in giá trị cookie ra trình duyệt
Trang 214 CÁC CƠ CHẾ THEO DÕI SESSION TRONG JSP (tiếp theo)
Trang 224 CÁC CƠ CHẾ THEO DÕI SESSION TRONG JSP (tiếp theo)
Cookie class method Summary
Object Clone() Tạo một copy của cookie, Overrides hành vi của lớp object
String getComment() – Lấy chú thích trong cookie, null nếu cookie không có chú thích
String getDomain() – Lấy tên domain đã thiết lập trong cookie
int getMaxAge() – Lấy tuổi thọ lớn nhất (số giây) của cookie, trả trị -1 nếu expirescủa cookie không được ấn định (bị mất lúc browser shutdown
String getName() – Lấy phần tên của cookie
String getPath() – Lấy đường dẫn trên server – phần path
boolean getSecure() – True nếu trình duyệt sử dụng protocol có bảo mật
String getValue() – Lấy trị, phần VALUE của cookie
int getVersion() – Lấy phiên bản của cookie.
void setComment(String purpose) – Thiết lập phần chú thích trong cookie
void setDomain(String pattern) – Thiết lập phần Domain
void setMaxAge(int expiry) – Thiết lập phần expires (theo đơn vị giây)
void setPath(String uri) – Thiết lập đường dẫn (path)
Trang 234 CÁC CƠ CHẾ THEO DÕI SESSION TRONG JSP (tiếp theo)
• Xóa cookie, không ghi cookie vào đĩa cứng máy client:
Một cookie có thể bị xóa bằng cách thiết lập expires=0 (setMaxAge(0));
Một cookie được ấn định tuổi thọ bằng setMaxAge(Số Âm) sẽ không được ghivào máy client (nghĩa là bên ngoài browser) mà chỉ tồn tại trong bộ nhớ RAM.Khi trình duyệt shutdown, cookie này bị mất
Theo dõi cookie bằng cách ghi lại URL (Rewriting URL)
• Khi cookie không được client chấp nhận, phương pháp ghi lại URL (URL rewriting, dùvất vả hơn kỹ thuật cookies) được áp dụng để quản lý session Các JSP containerkhác nhau (do các hãng phần mềm khác nhau tạo ra) có cách ghi lại URL khác nhau
Có JSP container làm việc này tự động, có JSP container lại để cho người dùng phảihiện thực
• Trong kỹ thuật ghi lại URL, session ID sẽ là một thành phần trong tham số của querystring của user
• Trong interface javax.servlet.http.HttpServletRespone, có hai method giúp người lậptrình ghi lại URL
Trang 244 CÁC CƠ CHẾ THEO DÕI SESSION TRONG JSP (tiếp theo)
String encodeRedirectURL(String url) – mã hóa url để dùng trong method
sendRedirect Nếu không cần mã hóa thì trả về chính url đó
String encodeURL(String url) – mã hóa url bằng cách thêm vào session ID
vào url này Nếu không cần mã hóa thì trả về chính url đó
• Khi user di chuyển giữa các trang, session ID được thêm vào chuỗi URL Nghĩa là,chúng ta phải tạo ra một session rồi gửi session ID cho servlet response đóng góitheo kỹ thuật URL rewriting Khi user khởi tạo một request, chúng ta lại phải tríchxuất session ID trong tham số của query string và sử dụng ID này
• Ví dụ sau sẽ minh họa việc sử dụng session để truyền thông tin giữa hai trang: trangExampleOfSession_URL_1.JSP sẽ khởi tạo một session và trangExampleOfSession_URL_2.JSP sẽ lấy thông tin của session
Trang 254 CÁC CƠ CHẾ THEO DÕI SESSION TRONG JSP (tiếp theo)
• Trang ExampleOfSession_URL_1.JSP:
• Trang ExampleOfSession_URL_21.JSP:
Trang 265 CHU KỲ SỐNG CỦA SESSION
• Chu kỳ sống của một session (session lifecycle);
• Sử dụng đối tượng session;
• Ràng buộc một đối tượng vào đối tượng request
Trang 275.1 CHU KỲ SỐNG CỦA MỘT SESSION (SESSION LIFECYCLE)
• Khi server nhận được một yêu cầu từ client, session được khởi tạo và được gán mộtsession ID
• Session ID được truyền về cho client như là một cookie hoặc là một biến ẩn (hiidenvariable)
• Session này được xem là “mới” cho đến khi user quay lại (truy xuất tiếp Website),session ID sẽ được đính kèm vào query string của client khi truy xuất tiếp server(trường hợp có dùng kỹ thuật URL rewriting) hoặc như là một cookie (trường hợpkhông dùng kỹ thuật URL rewriting) và server biết rằng session đã được tạo rồi.Trường hợp server không hỗ trợ kỹ thuật URL rewriting hoặc client không cho phépcookie thì session ID không trở về được server và truy xuất mới từ client sẽ khởi tạomột session mới
• Session tồn tại trong server cho đến khi session này không còn hợp lệ (tức hết thời lượng, page timeout) hay bị “chết” (nghĩa là server shutdown)
Trang 285.1 CHU KỲ SỐNG CỦA MỘT SESSION (SESSION LIFECYCLE) (tiếp
theo)
• Session là công cụ để theo dõi một client trong một khoảng thời gian Do vậy, nếuuser sang Website khác rồi lại trở về thì có thể session đã bị time-out, điều này tùythuộc vào thiết lập time-out trên server
• Ứng dụng có thẻ lưu trữ session trong một database để cho phép các session có thờilượng hợp lệ dài
• Các session được container cư xử như là một dịch vụ thư mục nên có thể tham khảotới session thông qua một tên gọi (chuỗi ký tự)
• Các đối tượng HttpSession được dùng để lưu trữ thông tin về các session trong đốitượng servlet context
• Đối tượng HttpServletRequest có hành vi getSession() để lấy session kết hợp vớirequest này
Trang 295.2 SỬ DỤNG ĐỐI TƯỢNG SESSION
Một số phương thức cơ bản của lớp HttpSession
HttpSession interface Method Summary
Object getAttribute(String name) – Lấy đối tượng là trị một thuộc tính.
Enumeration getAttributeNames() – Tập tên các đối tượng thuộc tính của session.
long getCreationTime() – Lấy giờ tạo theo millisec kể từ giữa đêm January 1, 1970
GMT.
String getId() – Lấy session ID.
long
getLastAccessedTime() – Lấy giờ truy xuất cuối từ client, theo millisec kể từ
giữa đêm January 1, 1970 GMT và là thời gian container nhận được yêu cầu từ client.
int getMaxInactiveInterval() – Lấy thời khoảng (đơn vị giây) mà session nàycòn hợp lệ (sever còn theo dõi client).
ServletContext getServletContext() – Lấy ServletContext mà session này thuộc về?
void Invalidate() – Kiểm tra session còn hợp lệ?
boolean isNew() – Kiểm tra session có còn là session mới?
void removeAttribute(String name) – Loại bỏ một thuộc tính.
void setAttribute(String name, Object value) – Ràng buộc, thiết lập trị cho 1 thuộc
tính, trị phải là Object.
Trang 305.2 SỬ DỤNG ĐỐI TƯỢNG SESSION (tiếp theo)
• Ví dụ 1: Chương trình sau đây sẽ sử dụng biến đối tượng session để đếm số lầnngười sử dụng bấm refresh trang web
Trang 315.2 SỬ DỤNG ĐỐI TƯỢNG SESSION (tiếp theo)
• Ví dụ 2: Chương trình sau đây sẽ sử dụng TimeBean đã xây dựng Truy xuất đốitượng session thông qua đối tượng request Sau đó, thông qua đối tượng sessiontruy xuất Bean
Trang 325.3 RÀNG BUỘC MỘT ĐỐI TƯỢNG VÀO ĐỐI TƯỢNG REQUEST
• Servlet 2.2 API cung cấp một cách làm tương tự như lưu trữ một đối tượng vào đốitượng session Đó là ràng buộc một đối tượng vào đối tượng request rồi sau đó tríchxuất đối tượng này
• Sự khác biệt giữa hai cách lưu trữ:
Đối tượng bị ràng buộc vào một request object chỉ tồn tại khi request đó còntồn tại (request kết thúc khi server đã trả response cho request này)
Trong khi đó, đối tượng lưu trong session tồn tại cho đến khi session không cònhợp lệ nữa → Đối tượng được lưu trong session tồn tại lâu hơn so với khi đượcràng buộc vào đối tượng request
• Sử dụng: Ràng buộc một đối tượng vào request object thường dùng khi forwardhoặc include một trang JSP (cơ chế forwarding hoặc interface RequestDispatcher)
Trang 335.3 RÀNG BUỘC MỘT ĐỐI TƯỢNG VÀO ĐỐI TƯỢNG REQUEST
(tiếp theo)
ServletRequest interface Method Summary
java.lang.Object getAttribute(java.lang.String name) - Lấy value của một thuộc
tính, null nếu không có thuộc tính này
java.util.Enumeration getAttributeNames() - Lấy tập tên thuộc tính
java.lang.String getCharacterEncoding() – Lấy tên bộ mã được dùng
int getContentLength() – Lấy độ dài nội dung -1 nếu không biết java.lang.String getContentType() – Lấy MIME type của thân request
ServletInputStream getInputStream() java.lang.String getLocalAddr() – Lấy Internet Protocol (IP)
java.util.Locale getLocale() – Lấy thông tin địa phương dựa Accept- Language
header
java.util.Enumeration getLocales()
java.lang.String getLocalName() – Lấy tên của Internet Protocol (IP) interface
int getLocalPort() – Lấy Internet Protocol (IP) port number java.lang.String getParameter(String name) – Lấy value của tham số name
Trang 345.3 RÀNG BUỘC MỘT ĐỐI TƯỢNG VÀO ĐỐI TƯỢNG REQUEST
(tiếp theo)
java.util.Enumeration getParameterNames() – Lấy tập tên tham số
java.lang.String[] getParameterValues(String name) – Lấy trị của tham số mảng
java.lang.String getProtocol() – Lấy tên protocol đã dùng theo dạng
protocol/majorVersion.minorVersion, thí dụ, HTTP/1.1
java.io.BuffereReader getReader()
java.lang.String getRemoteHost() – Lấy đích danh của client hay proxy
Int getRemotePort() – Lấy IP source port của client hay proxy
RequestDispatcher getRequestDispatcher(String path) – Lấy RequestDispatcher
object đóng vai trò đóng gói tài nguyên với path đã biết
java.lang.String getScheme() – Lấy tên của cơ chế tạo request này, thí dụ http,
https, hay ftp
java.lang.String getServerName() – Lấy tên server mà request này được gửi đến
isSecure() – Request này có dùng kênh truyền có bảo mật? Thí