7. Các phiên làm việc Session

Session được sử dụng để duy trì sự kết nối giữa Client và Server.  Khi trình duyệt yêu cầu Web Server cung cấp một trang tài liệu, nó thiết lập một kết nối, lấy về nội dung của trang yêu cầu và sau đó huỷ bỏ kết nối đó ngay lập tức. Để lưu lại dấu vết các trạng thái mà trình duyệt yêu cầu thực hiện trước đó, Web Server cài đặt sẵn đối tượng của  HttpSession. HttpSession dựa vào khái niệm Cookie qui định giữa Server và Client. Cookie là một mẩu tin được gửi cho trình duyệt ở Client khi có yêu cầu về một trang tin. Mỗi khi trình duyệt gửi một yêu cầu cho Server, nó lại chuyển mẩu tin Cookie trả lại cho Server. Dựa vào các Cookie mà chương trình Server và Client có được những thông tin trạng thái thông báo cho nhau.

Giao diện HttpSession có 3 phương thức thường xuyên sử dụng:

  • public void setAttribute(String name, Object value) throws IllegalStateException: Kết hợp một tên khoá với giá trị của biến.
  • public Object setAttribute(String name) throws IllegalStateException: Trả về đối tượng tương ứng với thuộc tính có tên là name.
  • public void removeAttribute(String name) throws IllegalStateException: Loại bỏ thuộc tính có tên là name.

Để sử dụng Session, ta thực hiện như sau:

  • Nhận về một đối tượng (của HttpSession) cho người sử dụng bằng cách gọi phương thức getSession() đối với đối tượng của lớp HttpServletRequest.

HttpSession userSession = request.getSession();

  • Lưu trữ và nhận dữ liệu từ Session. Giao diện cung cấp những phương thức để đặt lại giá trị cho các thuộc tính hoặc xác định chúng như đã nêu ở trên.

Ví dụ 7.1 Servlet thực hiện lưu trữ và đọc dữ liệu từ một Session.

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Date;

import java.util.Enumeration;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

public class SessionServlet extends HttpServlet {

public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws IOException, ServletException

{

response.setContentType(“text/html”);

PrintWriter out = response.getWriter();

out.println(“<html>”);

out.println(“<body bgcolor=\”white\”>”);

out.println(“<head>”);

String title = “Session Example”;

out.println(“<title>” + title + “</title>”);

out.println(“</head>”);

out.println(“<body>”);

// img stuff not req’d for source code html showing

// relative links everywhere!

// XXX

// making these absolute till we work out the

// addition of a PathInfo issue

out.println(“<a href=\”../sessions.html\”>”);

out.println(“<img src=\”../images/code.gif\” height=24 ” +

“width=24 align=right border=0 alt=\”view code\”></a>”);

out.println(“<a href=\”../index.html\”>”);

out.println(“<img src=\”../images/return.gif\” height=24 ” +

“width=24 align=right border=0 alt=\”return\”></a>”);

out.println(“<h3>” + title + “</h3>”);

HttpSession session = request.getSession(true);

out.println(“Session ID:” + ” ” + session.getId());

out.println(“<br>”);

out.println(“Created:” + ” “);

out.println(new Date(session.getCreationTime()) + “<br>”);

out.println(“Last Accessed:” + ” “);

out.println(new Date(session.getLastAccessedTime()));

String dataName = request.getParameter(“dataname”);

String dataValue = request.getParameter(“datavalue”);

if (dataName != null && dataValue != null) {

session.setAttribute(dataName, dataValue);

}

out.println(“<P>”);

out.println(“The following data is in your session:” + “<br>”);

Enumeration names = session.getAttributeNames();

while (names.hasMoreElements()) {

String name = (String) names.nextElement();

String value = session.getAttribute(name).toString();

out.println(HTMLFilter.filter(name) + ” = ”

+ HTMLFilter.filter(value) + “<br>”);

}

out.println(“<P>”);

out.print(“<form action=\””);

out.print(response.encodeURL(“SessionServlet”));

out.print(“\” “);

out.println(“method=POST>”);

out.println(“Name of Session Attribute:”);

out.println(“<input size=20>”);

out.println(“<br>”);

out.println(“Value of Session Attribute:”);

out.println(“<input size=20>”);

out.println(“<br>”);

out.println(“<input>”);

out.println(“</form>”);

out.println(“<P>GET based form:<br>”);

out.print(“<form action=\””);

out.print(response.encodeURL(“SessionServlet”));

out.print(“\” “);

out.println(“method=GET>”);

out.println(“Name of Session Attribute:”);

out.println(“<input size=20>”);

out.println(“<br>”);

out.println(“Value of Session Attribute:”);

out.println(“<input size=20>”);

out.println(“<br>”);

out.println(“<input>”);

out.println(“</form>”);

out.print(“<p><a href=\””);

out.print(response.encodeURL(“SessionExample?dataname=foo&datavalue=bar”));

out.println(“\” >URL encoded </a>”);

out.println(“</body>”);

out.println(“</html>”);

out.println(“</body>”);

out.println(“</html>”);

}

public void doPost(HttpServletRequest request,

HttpServletResponse response)

throws IOException, ServletException

{

doGet(request, response);

}

}

Lớp HTMLFilter

public final class HTMLFilter {

/**

* Filter the specified message string for characters that are sensitive

* in HTML.  This avoids potential attacks caused by including JavaScript

* codes in the request URL that is often reported in error messages.

*

* @param message The message string to be filtered

*/

public static String filter(String message) {

if (message == null)

return (null);

char content[] = new char[message.length()];

message.getChars(0, message.length(), content, 0);

StringBuffer result = new StringBuffer(content.length + 50);

for (int i = 0; i < content.length; i++) {

switch (content[i]) {

case ‘<‘:

result.append(“&lt;”);

break;

case ‘>’:

result.append(“&gt;”);

break;

case ‘&’:

result.append(“&amp;”);

break;

case ‘”‘:

result.append(“&quot;”);

break;

default:

result.append(content[i]);

}

}

return (result.toString());

}

}

8. Sự truyền thông giữa các Servlet

Các Servlet có nhiều cách trao đổi tin với nhau. Chúng cần trao đổi với nhau vì:

  • Một Servlet có thể truy cập trực tiếp đến các Servlet được nạp về và cần chúng thực hiện một số công việc nào đó. Một Servlet sử dụng đối tượng của ServletContext để nhận tin từ các Servlet khác.

public Servlet ServletContext.getServlet(String name)

throws ServletException

  • Một Servlet có thể sử dụng lại những khả năng của Servlet khác để thực hiện một nhiệm vụ nào đó.
  • Hai hoặc nhiều Servlet cần chia sẻ thông tin với nhau.

Ta có thể sử dụng phương thức getServlets():

public Enumeration ServletContext.getServlets()

để lấy về các đối tượng Servlet được nạp về từ ngữ cảnh Servlet hiện thời ServletContext.

Ví dụ Chương trình sau mô tả sự trao đổi tin giữa các Servlet với nhau.

// InterServlet.java

import java.io.*;

import java.util.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class InterServlet extends HttpServlet{

public void doGet(HttpServletRequest re, HttpServletResponse res)

throws IOException{

res.setContentType(“text/plain”);

PrintWriter out = res.getWriter();

ServletContext ct = getServletContext();

Enumeration num = ct.getServletNames();

out.println(“<HTML>”);

out.println(“<HEAD><TITLE>Demo Servlet </TITLE></EAD>”);

out.println(“<h3>!!Warning </h3>”);

out.println(“getServletNames() —-“);

try{

while(num.hasMoreElement()){

String nm = (String)num.nextElement();

out.println(nm);

Servlet s = ct.getServlet(nm);

out.println(“Servlet Name: ” + nm);

out.println(“Servlet classe: ” + s.getClass().getName());

out.println(“Servlet Information: ” + s.getServletInfo());

out.println();

}

}catch(Exception e){

System.out.println(“Error: ” + e);

}

}

}

Các bài viết liên quan:
Tìm hiểu Servlet – Phần 2