Tải bản đầy đủ (.pdf) (60 trang)

Bài giảng lập trình ứng dụng mạng bài 7 GV võ tấn dũng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (766 KB, 60 trang )

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.


Login.html
<!-- Login.html -->
<HTML>
<BODY bgcolor="FFFFFF">
<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>
</TR>
<TR> <TD>Password:</TD>
<TD><INPUT type="PASSWORD“ value="password"></TD>
</TR>

</Table>
<BR> <INPUT type="SUBMIT" value="Login!">
</BODY>
</HTML>

8

GV: Võ Tấn Dũng

</FORM>


9

GV: Võ Tấn Dũng

HIDDEN FORM FELDS


File Login.jsp
<HTML> <BODY bgcolor="#FF0000">
<% //Lay cac thong tin dang nhap
String userName=request.getParameter("username");
String password=request.getParameter("password");
%> Welcome, <%=userName%>!
<FORM ACTION="BookServlet" METHOD="POST">
<%--Luu username vao bien form an --%>

<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>
<option value="XML">XML</OPTION>
<option value=".NET">.NET Platform</OPTION>
<P> <INPUT type="submit" value="Choose Book!">
10

</FORM> </BODY> </HTML>

GV: Võ Tấn Dũng

</SELECT>


File Login.jsp

11

GV: Võ Tấn Dũng

y A


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.

<%-- Login2.jsp --%> <%@ page language="java" import="java.util.*;" %>

<HTML> <BODY bgcolor="#FFFFFF">
<% String userName=request.getParameter("username");
String password=request.getParameter("password");
String userKey=storage.UserDataTable.createUserData();
Hashtable userData=storage.UserDataTable.getUserData(userKey);
userData.put("username", userName); %>
Welcome, <%=userName%>!
<FORM action="BookServlet2" method="POST">

package storage;
import javax.servlet.*;
import java.io.*;
import java.util.*;
public class NewServlet /*BookServlet2*/ extends GenericServlet
{
public void service(ServletRequest request, ServletResponse response)
throws IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String book=request.getParameter("book");
19

Hashtable userData=storage.UserDataTable.getUserData(userKey);

GV: Võ Tấn Dũng

String userKey=request.getParameter("userkey");


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”);


25

GV: Võ Tấn Dũng

Viết lại trang Login2.jsp dùng session


×