Ta có thể theodõi các phiên làm việc session tracking của một web client bằng các cách sau: y Lưu dữ liệu trong các biến ẩn của form hidden fields.. y Lưu dữ liệu trong bảng băm hash tab
Trang 3protocol) Khi một lời yêu cầu (request) được tạo ra từ
client thì một kết nối (connection) được mở ra, đáp ứng
(response) gửi từ server xuống client Sau đó, kết nối
được đóng lại ngay
tiếp các request/response liên tiếp thì hậu quả là Web
Server không nhớ được các bước request/response
trước đó
xong thì chuyển sang trang tính tiền Lúc này Web
Server không nhớ trước đó ta đã chọn mặt hàng nào
Trang 4có kết nối duy trì thường xuyên giữa trình khách (web
browser) và trình chủ (web server)
liệu, trình duyệt mở kết nối, lấy về trang dữ liệu và sau
đó đóng kết nối ngay lập tức Vì vậy Web Server sẽ
không biết được trước đó trình duyệt đã có những trạng
thái nào
trình khách và trình chủ trong quá trình liên lạc Một
loạt các request từ một client sẽ được liên kết với một
session
Trang 5xảy ra trước đó của một client bất kỳ? Ta có thể theo
dõi các phiên làm việc (session tracking) của một web
client bằng các cách sau:
y Lưu dữ liệu trong các biến ẩn của form (hidden fields).
y Lưu dữ liệu trong đối tượng session.
y Lưu dữ liệu trong bảng băm (hash table)
y Lưu dữ liệu toàn cục của ứng dụng web trong đối tượng
application.
Trang 7submit một form, form sẽ chứa một số biến ẩn chứa
thông tin trạng thái hoặc liên quan đến người dùng
đang tương tác với ứng dụng
luôn phải truyền các biến ẩn liên tục giữa các trang có
liên hệ với nhau
ví dụ này là giữ lại thông tin username để các trang
khác truy cập
Trang 8<H1>Login</H1> Please log in
<FORM action="Login.jsp" method="POST">
<table> <TR> <TD> User Name: </TD>
<TD><INPUT type="TEXT“ name="username"></TD>
Trang 10<FORM ACTION="BookServlet" METHOD="POST">
<% Luu username vao bien form an %>
<INPUT type="HIDDEN" NAME="username" VALUE="<%=userName%>">
<P>Please enter your favorite book:
<SELECT name ="book">
<option value="C" SELECTED>C/C++</OPTION>
Trang 12import javax.servlet.*; import java.io.*;
public class BookServlet extends GenericServlet
{ public void service(ServletRequest request, ServletResponse response)
Trang 13y Ví dụ trên cho ta thấy, thông tin hay giá trị của username được nhập vào từ
trang Login.html truyền cho trang Login.jsp Trang Login.jsp lưu giá trị này
trong biến ẩn của form và chuyển tiếp cho Servlet Quá trình cứ thế tiếp diễn
cho đến khi nào bạn thôi không còn muốn sử dụng thông tin của username
nữa.
Trang 15được sử dụng nhiều trong các ứng dụng Web thương
mại nhất là các site e-commerce đó là tính không bảo
mật của giá trị và tên biến
có thể đánh lừa BookServlet bằng cách dùng trình
duyệt xem code HTML mà BookServlet gửi xuống và
dễ dàng nhận thấy có biến ẩn username Sau đó người
dùng có thể truyền trực tiếp giá trị cho username ngay
trên đường dẫn:
y http://localhost:8080/BookServlet?username=abc&book=Java
Trang 16Form, ta dùng cơ chế bảng băm (Hash Table).
bạn sinh ra một khóa ngẫu nhiên tương ứng với
username Khóa này được đặt trong biến ẩn của Form
đồng thời lưu giá trị thực tế của biến username và khóa
trong đối tượng bảng băm trên server
trang JSP hay Servlet của ta không chuyển giá trị của
username mà chuyển giá trị của khóa tương ứng với nó
Có giá trị khóa, thực hiện dò trong bảng băm ta sẽ tìm
ra được giá trị của biến username
Trang 17y Đối tượng bảng băm dùng sinh khóa và lưu dữ liệu cho biến được cài đặt thành lớp UserDataTable như sau:
/* UserDataTable.java */ package storage; import java.util.*;
public class UserDataTable {
protected static Hashtable userData=new Hashtable();
protected static Random keyGenerator = new Random();
public static String createUserData()
{ String userKey=""+keyGenerator.nextLong();
userData.put(userKey, new Hashtable());
return userKey;
}
public static Hashtable getUserData(String userKey)
{ if(userKey==null) return null;
Trang 18y Trang Login2.jsp sau đây thay vì lưu nội dung username vào biến ẩn của Form, chúng ta gọi
UserDataTable sinh khóa và lưu khóa vào biến Form ẩn.
<% Login2.jsp %> <%@ page language="java" import="java.util.*;" %>
<FORM action="BookServlet2" method="POST">
<INPUT type="HIDDEN" name="userkey" value="<%=userKey%>">
<P>Please enter your favorite Book:
<SELECT name="book"> <OPTION value="C" SELECTED>C/C++</OPTION>
<OPTION VALUE="Java">Java</OPTION> <OPTION VALUE="Linux">Linux</OPTION>
Trang 19y Dưới đây là mã nguồn của BookServlet2.jsp thay thế cho BookServlet BookServlet nhận giá trị
khóa, tìm dữ liệu tương ứng của khóa trong bảng băm và in ra kết xuất.
Trang 22thuộc lớp HttpSession HttpSession dựa vào khái niệm
cookie quy định giữa trình khách và trình chủ Cookie
là một mẩu thông tin được gởi về trình duyệt phía máy
khách khi có yêu cầu trang từ server Mỗi khi trình
duyệt phát sinh yêu cầu gửi lên server, nó lại chuyển
mẩu cookie trở lại trình chủ Dựa vào cookie, trình
khách và trình chủ sẽ có được những thông tin trạng
thái thông báo cho nhau
Trang 23Nếu muốn chủ động làm cho session hết hiệu lực thì ta
gọi phương thức: session.invalidate()
Trang 24y Chú ý: Giá trị mà ta muốn lưu hay lấy về phải là
một đối tượng (Object) Đối với các giá trị có kiểu
int, float, boolean,… thì ta phải chuyển sang kiểu
lớp tương ứng như Integer, Float, Boolean,…
Trang 27trong Servlet thì session không có sẵn Ta phải lấy
session thông qua đối tượng request
hoàn toàn có thể truy xuất được từ servlet
được đối tượng HttpRequest để truy xuất biến session
Trang 30tạo ra đối tượng session, trình chủ gửi một định danh
ID của session cho trình duyệt
một mẩu tin cookies
nào từ server, trình duyệt sẽ gửi ngược định danh ID
này về trình chủ
Trang 31bỏ khi bạn đóng cửa sổ trình duyệt.
cứng cho lần sử dụng kế tiếp
gian tương tác ngắn nên không nhất thiết lúc nào cũng
phải lưu thông tin cookies xuống đĩa cứng trừ khi bạn
muốn cấu hình cơ chế lưu cookies này
duyệt vẫn gửi yêu cầu gọi nó thì trình chủ sẽ phát sinh
ngoại lệ IllegalStateException
Trang 33trên trang web của bạn Người dùng chọn một số mục
hàng rồi sau đó lại không muốn mua
trang web thì người dùng lại chọn giải pháp thoát ra và
đăng nhập trở lại Khi đó toàn bộ thông tin mua hàng
cùng với các thông tin trước đó phải bị xóa sạch
code xóa nội dung trong session hoặc tạo một session
mới
Trang 34chúng ta đều dùng phương thức getSession().
được tạo ra nếu nó chưa có trước đó Ngược lại với đối số là
false, khi không tìm thấy đối tượng session thì phương thức
getSession() sẽ trả về giá trị null.
Trang 35hai trường hợp: ta chủ động gọi phương thức
invalidate() của nó hoặc Webserver hủy session do thời
gian hiệu lực hết hạn (session timeout)
một vài thao tác xóa biến, dọn dẹp các đối tượng trước
khi session bị hủy
nối đến cơ sở dữ liệu Hãy thực hiện hủy kết nối này
trước khi xóa session vì nó làm cho ứng dụng của ta
tăng tốc xử lý đối với các người dùng còn lại
Trang 36(callback) để thông báo cho một đối tượng nào đó trạng
thái đối tượng được ràng buộc vào session hoặc khi
session bị hủy
session.setAttribute(“somename”,someObject), đối
tượng some Object được thông báo rằng nó được ràng
buộc vào session Khi session hết hạn, someObject
cũng sẽ được thông báo về sự kết thúc của session để
đối tượng có thể tự thực hiện các thao tác hủy của
mình
Trang 37diện HttpSessionBindingListener Giao diện này có 2
phương thức cơ bản là:
vào session còn valueUnBound sẽ được gọi khi đối
tượng bị loại bỏ khỏi session
nghe các trạng thái ràng buộc đối tượng vào session
bằng cách tăng hoặc giảm biến đếm cho biết số lần đối
tượng được đưa vào hoặc lấy ra khỏi session
Trang 45HTTP cookies Cookies lưu trữ giá trị nhận dạng
session ID cho mỗi yêu cầu phát sinh và trao đổi giữa
trình duyệt với Web server
cấu hình không cho trình duyệt sử dụng cơ chế cookies
tham số đến tất cả các trang JSP và Servlet trong ứng
dụng
cookies và chuyển đi trong mỗi lời yêu cầu, ta thực
hiện việc này một cách tường minh với session ID
được đặt trên URL
Trang 46cho phép chèn session ID vào đường dẫn URL trong
các lời gọi trang và Servlet:
y public String encodeURL(String url)
y public String encodeRedirectURL(String url)
về đường dẫn tham chiếu URL chứa session ID
một form, xử lý và nhận dữ liệu do form submit, đặt
các giá trị nhận được từ form vào biến session
Trang 52liệu tương ứng và tách biệt đối với người dùng Mặc dù
vậy sẽ có lúc ta cần lưu những biến toàn cục để mọi
trang JSP hay Servlet thuộc về các session khác nhau
đều có thể nhìn thấy được giá trị của biến
biến có thể nhìn thấy toàn cục
Trang 53lưu trữ và loại bỏ biến hoàn toàn tương tự các phương
thức mà session cung cấp
Trang 54đếm số người dùng truy cập trang web bằng biến
GlobalCounter lưu trong đối tượng application như
sau:
Trang 55giao diện ServletContext Trong servlet ta có thể lấy
giao tiếp này để dùng cho mục đích lưu biến vào đối
tượng application Biến application trong servlet có
được bằng cách sử dụng lệnh sau:
tham chiếu của đối tượng application như sau:
Trang 56application khác nhau ra sao, ta có thể kiểm tra bằng
trang TestVariable.jsp như sau:
Trang 58duyệt khác nhau Kết quả giá trị biến appCount tăng
liên tục trong khi biến sesCounter chỉ tăng cục bộ trong
từng cửa sổ trình duyệt