bài 3: servlet&cookie&session - lập trình mạng nâng cao

41
Quản lý phiên của ứng dụng ThS Văn Thiên Hoàng

Upload: tuan-nguyen

Post on 26-Jun-2015

803 views

Category:

Technology


8 download

DESCRIPTION

Lập Trình Mạng Nâng Cao - Servlet, Cookie, Session

TRANSCRIPT

Page 1: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Quản lý phiên của ứng dụng

ThS Văn Thiên Hoàng

Page 2: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Mục đích

Trình bày cách xử lý thông tin trong một phiên giao tiếp trong servlet và giữa các trang web.

Page 3: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Thông tin cần duy trì trong phiên

Server cần lưu hai loại thông tin trong một phiên giao tiếp. Thông tin về phiên giao tiếpThông tin của người sử dụng

Http thì không duy trì trạng thái.

Page 4: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Giải pháp

Gửi qua lại client – serverSử dụng các thành phần ẩn của form

Lưu trữ thông tin phía client.Sử dụng Cookie

Lưu trữ thông tin phiên phía serverSession

Page 5: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Thần phần ẩn của form

<input type="hidden" name="sessionID" value="...">

Lấy giá trị biến ẩn trong form và gởi trả lại để duy trì thông tin phiên trong trang.

• String sessionID = getParameter("sessionID");• out.println("<input

type=\"hidden\" name=\"sessionID\" value=\" + sessionID + "\">");

Page 6: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Cookie là gì?

Cookie là một chuỗi văn bản dạng name=value.

Cookie được lưu trên máy client.URL được lưu trong mỗi cookie để

browse xác định địa chỉ server để gởi trả cookie về phía server.

Page 7: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Thao tác với Cookies

Java Servlet API cung cấp bộ công cụ để thao tác với cookie.

Lớp javax.servlet.http.Cookie biểu diễn cookie. Phương thức lấy giá trị

• getName(), getValue(), getPath(), getDomain(), getMaxAge(), getSecure()…

Phương thức thiết lập• setValue(), setPath(), setDomain(), setMaxAge()…

Lấy tất cả các cookie từ request

• Cookie[] HttpServletRequest.getCookies()

Gởi cookie về client

• HttpServletResponse.addCookie(Cookie cookie)

Page 8: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Các bước tạo cookie

Ba bước để tạo cookie1) Tạo đối tượng cookie

Cookie cookie = new Cookie (name, value);

2) Thiết lập thuộc tính cookie Cookie.setMaxAge (60);

3) gởi cookie về client Response.addCookie (cookie)

Page 9: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Gởi cookie về phía client

Tạo đối tượng CookieCookie c = new Cookie("userID", "a1234");

Thiết lập thời gian sống của cookie trên đĩa cứng của client (đơn vị giây). c.setMaxAge(60*60*24*7); // một tuần

Đặt cookie vào đối tượng HTTP response để gởi về client.response.addCookie(c);

Page 10: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Ví dụ:

<html>

<head><title>Insert your Name</title></head>

<body> <h1>What is your name?</h1>

<form action="welcomeback" method="get">

<p>

<input type="text" name="username" />

<input type="submit" />

</p>

</form>

</body>

</html>

getname.html

Page 11: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Ví dụ

public class WelcomeBack extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException {

String user = req.getParameter("username");

if (user == null) { // Find the "username" cookie

Cookie[] cookies = req.getCookies();

for (int i = 0; cookies != null && i < cookies.length; ++i) {

if (cookies[i].getName().equals("username"))

user = cookies[i].getValue();

}

} else res.addCookie(new Cookie("username", user));

WelcomeBack.java

Page 12: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Ví dụ (tiếp theo)

if (user == null) // No parameter and no cookie

res.sendRedirect("getname.html");

res.setContentType("text/html");

PrintWriter out = res.getWriter();

out.println("<html><body><h1>Welcome Back " + user

+ "</h1></body></html>");

}

} WelcomeBack.java

Page 13: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Session là gì?

Giải pháp để duy trì dữ liệu gởi qua nhiều trang ở Server.

Để lưu thông tin, Session tạo ra cơ chế để quản lý cookie cho từng phiên với một id để nhận dạng hoặc sử dụng URL.

Page 14: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Session Cookies

Web browser 1

Web server

request request

ServletServlet

id1

response

put cookie id1

response

Create Session

id1

Page 15: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Session Cookies

Web browser 2

Web server

request request

ServletServlet

id1

response

put cookie id2

response

Create Session

id2id2

Page 16: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Session Cookies

Web server

request

ServletServlet

id1

response response

request

Cookie: id1

id2

Session read/write

Web browser 1

id1

Page 17: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Session Cookies

Web server

request

ServletServlet

id1

response response

request

Cookie: id2

id2

Session read/write

Web browser 2

id2

Page 18: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

sessionId list

Page 19: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Truy cập dữ liệu Session

Đối tượng session là thể hiện của lớp HttpSession.

Sử dụng phương thức getSesssion() hoặc getSession(true) để lấy đối tượng HttpSession

hiện tại hoặc tạo ra nó nếu không có.

Sử dụng getSession(false) nếu không muốn tạo ra session mới khi session không tồn tại.

Page 20: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Các phương thức của HttpSession

Dữ liệu Session được truy cập bằng bảng băm. - setAttribute(String name,Object value)

- Object getAttribute(String name)

Các phương thức khác:- removeAttribute, getAttributeNames

- isNew, invalidate, getId

- getCreationTime, getLastAccessedTime

- getMaxInactiveInterval, setMaxInactiveInterval

Page 21: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Ví dụ: Shopping Cart cơ bản

Ví dụ về một shopping cart trực tuyến cơ bản gồm Servlet- Store.java: trang chính - ShoppingCart.java: xử lý sự kiện

Page 22: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Ví dụ: Online-Store

public class Store extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

res.setContentType("text/html");

PrintWriter out = res.getWriter();

out.println("<html><head>"

+ "<link rel=\"stylesheet\" type=\"text/css\""

+ " href=\"cartstyle.css\"/></head><body>");

HttpSession session = req.getSession();

if (session.getAttribute("item-list") == null) {

out.println("<h1>Hello new visitor!</h1>");

session.setAttribute("item-list", new LinkedList());

}

List itemList = (List) session.getAttribute("item-list");

Store.java

Page 23: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Ví dụ: Online-Store out.println("<h2>Your Shopping Cart:</h2><ol>");

for (Iterator it = itemList.iterator(); it.hasNext();)

out.println("<li>" + it.next() + "</li>");

out.println("</ol>");

out.println("<form method=\"post\" action=\"cart\">");

out.println("<p>Add item:<input name=\"item\" type=\"text\"/>"

+ "<input type=\"submit\" value=\"send\"/></p>"

+ "<p><input type=\"submit\" value=\"empty cart\" "

+ "name=\"clear\"/></p></form>");

out.println("</body></html>");

}

} Store.java

Page 24: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

public class ShoppingCart extends HttpServlet {

public void doPost(HttpServletRequest req, HttpServletResponse

res) throws ServletException, IOException {

res.setContentType("text/html");

PrintWriter out = res.getWriter();

List items = (List) req.getSession().getAttribute("item-list");

out.println("<html><head><link rel=\"stylesheet\""

+ " type=\"text/css\" href=\"cartstyle.css\"/>"

+ "</head><body>");

ShoppingCart.java

Ví dụ: Online-Store

Page 25: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

if (req.getParameter("clear") != null) {

items.clear();

out.println("<h2>Your Shopping Cart is Empty!</h2>");

} else {

String item = req.getParameter("item");

items.add(item);

out.println("<h2>The item <i>" + item +

"</i> was added to your cart.</h2>");

}

out.println("<h2><a href=\"store\">Return to the store</a></h2>");

out.println("</body></html>");

}} ShoppingCart.java

Ví dụ: Online-Store

Page 26: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Viết vào URL

Web browser

Web server

request request

ServletServlet

id1

response response

Create Session

<HTML…>

< A HREF=“servletURL;sessID=id1>”

/<…HTML>

Page 27: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

URL Rewriting

Web server

request

ServletServlet

id1

response response

request

(no cookie)

id2

Session read/write

Web browser 1

GET servletURL;sessID=id1 HTTP/1.0

<HTML…>

<A HREF=“servletURL;sessID=id1>”

/<…HTML>

Page 28: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Viết lại Servlet URL

Sử dụng các phương thức để viết vào URL- String encodeURL(String url)

• Sử dụng cho HTML hyperlink

- String encodeRedirectURL(String url)• Sử dụng cho HTTP redirection

Các phương thức này xác định session ID cần được mã hóa trong URL.

Nếu truy vấn có cookie thì url được gởi về bình thường.

Page 29: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Chương trình Store

Giả sử chương trình store chạy trên client không hỗ trợ cookie.

Để giải quyết, việc viết vào URL nên được sử dụng. Store.java

"<form method=\"post\" action=\"" + res.encodeURL("cart") + "\">“

ShoppingCart.java

“<a href=\"" + res.encodeURL("store") + "\">"

Page 30: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Session Listener

session listener được sử dụng để phản ứng các sự kiện liên quan đến đến session. session mới được tạo. Một session bị hủy.

Để sử dụng được session listener, cài đặt giao diện javax.servlet.http.HttpSessionListener.

Page 31: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Ví dụ: Session-Listener

public class CartInitializer implements HttpSessionListener {

public void sessionCreated(HttpSessionEvent se) {

List itemList = new LinkedList();

se.getSession().setAttribute("item-list",itemList);

itemList.add("A Free Apple");

}

public void sessionDestroyed(HttpSessionEvent se) {}

} CartInitializer.java

<listener>

<listener-class>CartInitializer</listener-class>

</listener> web.xml

Page 32: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Forwarding và Redirection

Mặc định, SendRedirect không đảm bảo tham số của request được gới lên từ client.

SendRedirect kết thúc khi một URL khác được nạp ở client.

Forwarding cho phép gởi toàn bộ dữ liệu của request tới trang khác. Để forward sử dụng request Dispatcher.

Page 33: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

The Request Dispatcher

Page 34: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Request Dispather

Đối tượng RequestDispatcher được sử dụng để gởi một client request tới một trang bất kỳ (servlet, JSP hoặc HTML) ở server.

Để lấy đối tượng gởi request tới nguồn x, sử dụng:getServletContext().getRequestDispatcher("x")

Page 35: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Các phương thức của đối tượng Request Dispatcher

void forward(ServletRequest request,

ServletResponse response)

Chuyển request từ servlet tới nguồn khác.

void include(ServletRequest request,

ServletResponse response)

Bao gồm cả nội dụng của response.

Page 36: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Chuyển dữ liệu

3 cách để chuyển tham số cho Servlet hoặc JSPDữ liệu được dùng chỉ cho request này:

request.setAttribute("key", value);Dữ liệu được sử dụng cho client (và cả cho các

request về sau)session.setAttribute("key", value);

Dữ liệu sẽ được dùng trong tương lai của mỗi client. context.setAttribute("key", value);

Page 37: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Ví dụ

Servlet JokesAndImages cho phep người sử dụng chọn joke ngẫu nhiên hoặc ảnh ngẫu nhiên.

Server có 5 ảnh trong thư mục images/ và 5 joke (txt file) trong thư mục jokes/

Các yêu cầu rỗng sẽ được gởi tới tập tin HTML nó cho phép người dụng chọn ảnh hoặc joke.

Request với joke được gởi tới trang servlet Jokes

Requests với image được gởi tới một ảnh ngẫu nhiên trong thư mục images/

Page 38: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Joke và Image

<html>

<head><title>Images and Jokes</title></head>

<body>

<h1>Please Select:</h1>

<form method="post" action="JokesAndImages">

<h2>

<input type="submit" name="joke"

value="A Joke" />

<input type="submit" name="image"

value="An Image" />

</h2>

</form>

</body></html> imagesJokesOptions.html

Page 39: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Joke và Imagepublic class JokesAndImages extends HttpServlet {

public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

int randomNum = 1 + Math.abs((new Random()).nextInt() % 5);

if (req.getParameter("joke") != null) {

req.setAttribute("jokeNumber", new Integer(randomNum));

getServletContext().getRequestDispatcher("/Jokes").forward(req,res);

} else if (req.getParameter("image") != null) {

getServletContext().getRequestDispatcher("/images/image" +

randomNum + ".gif").forward(req, res);

} else getServletContext().getRequestDispatcher

("/imagesJokesOptions.html"). forward(req,res);

}

public void doGet ... }} JokesAndImages.java

Page 40: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Joke và Image

public class Jokes extends HttpServlet {

public void doPost(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException {

res.setContentType("text/html");

PrintWriter out = res.getWriter();

out.println("<html><body><h1>A Joke</h1><pre>");

int jokeNum = ((Integer) req.getAttribute("jokeNumber")).intValue();

getServletContext().getRequestDispatcher

("/jokes/joke" + jokeNum + ".txt").include(req, res);

out.println("\n</pre>");

out.println("<a href=\"" + req.getRequestURL() + "\">Back</a>");

out.println("</body></html>");

}} Jokes.java

Page 41: Bài 3: Servlet&Cookie&Session - Lập Trình Mạng Nâng Cao

Câu hỏi