TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN TP.HCM LẬP TRÌNH ỨNG DỤNG MẠNG
BÀI 7
GIẢNG VIÊN:
1
VÕ TẤN DŨNG
GV: Võ Tấn Dũng
XỬ LÝ BIẾN SESSION
PHẦN 1
2
GV: Võ Tấn Dũng
KHÁI NIỆM SESSION
HTTP là giao thức phi trạng thái protocol). 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. y Nếu một transaction (giao tác) thực hiện một chuỗi liên
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 đó. y Ví dụ, khi ta mua sắm online, ta chọn các mặt hàng 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. 3
GV: Võ Tấn Dũng
y Giao thức HTTP là giao thức phi trạng thái (stateless
Khái niệm session có kết nối duy trì thường xuyên giữa trình khách (web browser) và trình chủ (web server). y Khi trình duyệt cần trình chủ cung cấp một trang tài 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. y Session tượng trưng một giai đoạn duy trì kết nối giữa 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. 4
GV: Võ Tấn Dũng
y Ta đã nhận rõ một điều rằng trong dịch vụ Web không
Khái niệm session y Như vậy, làm thế nào để server nhớ được các giao tác
xả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
5
GV: Võ Tấn Dũng
application.
PHẦN 2
6
GV: Võ Tấn Dũng
HIDDEN FORM FIELDS
HIDDEN FORM FELDS
y Ý tưởng ở đây là mỗi khi người dùng thực hiện thao tác
submit 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. y Trở ngại lớn nhất của phương pháp này là chương trình 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. y Ví dụ: ta hãy xem ví dụ ở slide sau đây. Mục đích của
7
GV: Võ Tấn Dũng
ví dụ này là giữ lại thông tin username để các trang khác truy cập.
File BookServlet.java import javax.servlet.*; import java.io.*; public class BookServlet extends GenericServlet { public void service(ServletRequest request, ServletResponse response) throws IOException {
response.setContentType("text/html"); PrintWriter out=response.getWriter(); String userName=request.getParameter("username"); String book = request.getParameter("book"); out.println("<HTML>"); out.println("<BODY bgcolor=\"#00FF00\">"); out.println("Well, I see that "+userName+"'s favorite book is "+ book +"."); out.println("</BODY>"); out.println("</HTML>"); } 12
GV: Võ Tấn Dũng
}
y
13
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.
GV: Võ Tấn Dũng
File BookServlet.java
PHẦN 3
SỬ DỤNG HASH TABLE
14
GV: Võ Tấn Dũng
(dùng để bảo mật các biến ẩn của Form)
SỬ DỤNG HASH TABLE y Một trong những lý do mà biến ẩn của Form không
đượ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. y Với ví dụ BookServlet của các slide trước, người dùng 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:
15
GV: Võ Tấn Dũng
y http://localhost:8080/BookServlet?username=abc&book=Java
SỬ DỤNG HASH TABLE Form, ta dùng cơ chế bảng băm (Hash Table). y Khi việc chứng thực username/password thành công, 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. y Lần kế tiếp người dùng chuyển biến ẩn lê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. 16
GV: Võ Tấn Dũng
y Để giải quyết tính không bảo mật của các biến ẩn trong
File UserDatatable.java Đố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:
y
/* 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; return (Hashtable)userData.get(userKey); } public static void clearUserData(String userKey) userData.remove(userKey); 17
}
}
GV: Võ Tấn Dũng
{ if(userKey==null) return;
File Login2.jsp y
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.
File BookServlet2.java if(userData==null) { out.println("<HTML><BODY>"); out.println("<H1>Sorry</H1>"); out.println("The system is experiencing problems."); out.println("</BODY></HTML>"); return; }
String userName=(String)userData.get("username"); out.println("<HTML>"); out.println("<BODY bgcolor=\"#FFFFFF\">"); out.println("Well, I see that "+userName+"'s favorite book is "+book+"."); out.println("</BODY>"); } }
20
GV: Võ Tấn Dũng
out.println("</HTML>");
PHẦN 4
21
GV: Võ Tấn Dũng
SỬ DỤNG ĐỐI TƯỢNG SESSION
LỚP HttpSession y Trong Java, Web server cài đặt sẵn đối tượng session
22
GV: Võ Tấn Dũng
thuộ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.
SỬ DỤNG ĐỐI TƯỢNG SESSION VỚI JSP y Với đối tượng session thuộc lớp HttpSession, ba
23
GV: Võ Tấn Dũng
phương thức mà ta thường sử dụng nhất là: y public void setAttribute(String name, Object value) throws IlligalStateException y public Object getAttribute(String name) throws IlligalStateException y public void removeAttribute(String name) throws IlligalStateException y Biến session chỉ tồn tại trong một thời gian nhất định. Nế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()
SỬ DỤNG ĐỐI TƯỢNG SESSION VỚI JSP y 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,… y Ví dụ:
24
GV: Võ Tấn Dũng
Integer tuoicuatui= new Integer(35); session.setAttribute(“tuoi”,tuoicuatui); Integer my_age = (Integer)session.getAttribute(“tuoi”);