l 程序包含一個HTML文件和兩個Servlet組件:logon.html、LogonServlet.java和CoursesServlet.java。
l logon.html提供用戶登錄的界面;LogonServlet.java是一個負責處理用戶登錄的Servlet程序。
l CoursesServlet.java完成了三項功能:顯示所有可選課程的列表、將用戶選擇的課程放入購物車、顯示購物車中的課程。
l LogonServlet.java的登錄驗證方式非常簡單,只要登錄的用戶名不爲空白字符串即可;LogonServlet.java先將成功登錄的用戶名保存到Session中,然後將請求轉發給CoursesServlet.java顯示所有可選課程的列表;如果登錄失敗,LogonServlet.java則再次顯示登錄界面。
l CoursesServlet.java需要完成如下任務:
l 首先判斷訪問請求是否來自一個已登錄用戶,如果不是,則將請求重定向到logon.html頁面。
l 接着判斷當前訪問請求是否是用戶選擇課程時發出的,如果是,則將用戶選擇的課程加入購物車。
l 最後顯示出所有供選擇的課程列表和已放入購物車中的課程列表。
String courseSelect = request.getParameter("course");
if(courseSelect != null)
{
Vector vCourses = (Vector)session.getAttribute("courses");
if(vCourses == null)
{
vCourses = new Vector();
vCourses.add(courseSelect);
session.setAttribute("courses",vCourses);
}
else
{
if(vCourses.contains(courseSelect))
{
out.println(sessionName + ",你以前選擇過了" +
courseSelect + "<hr>");
}else
{
vCourses.add(courseSelect);
}
}
}
二,利用Session防止表單重複提交à原理
l 包含有FORM表單的頁面必須通過一個服務器程序動態產生,服務器程序爲每次產生的頁面中的FORM表單都分配一個唯一的隨機標識號,並在FORM表單的一個隱藏字段中設置這個標識號,同時在當前用戶的Session域中保存這個標識號。
l 當用戶提交FORM表單時,負責接收這一請求的服務器程序比較FORM表單隱藏字段中的標識號與存儲在當前用戶的Session域中的標識號是否相同,如果相同則處理表單數據,處理完後清除當前用戶的Session域中存儲的標識號。在下列情況下,服務器程序將忽略提交的表單請求:
ü 當前用戶的Session中不存在表單標識號
ü 用戶提交的表單數據中沒有標識號字段
ü 存儲在當前用戶的Session域中的表單標識號與表單數據中的標識號不同
l 瀏覽器只有重新向WEB服務器請求包含FORM表單的頁面時,服務器程序才又產生另外一個隨機標識號,並將這個標識號保存在Session域中和作爲新返回的FORM表單中的隱藏字段值。
l 程序包含三個Java源程序:TokenProcessor.java、FormGenerateServlet.java和FormDealServlet.java。
l TokenProcessor.java是用於管理表單標識號的工具類,它主要用於產生、比較和清除存儲在當前用戶Session中的表單標識號。爲了保證表單標識號的唯一性,每次將當前SessionID和系統時間的組合值按MD5算法計算的結果作爲表單標識號,並且將TokenProcessor類設計爲單件類。
l FormGenerateServlet.java是用於產生FORM表單的Servlet程序,FormDealServlet是負責處理FORM表單請求的Servlet程序。
l 問題:
同一個用戶打開同一個瀏覽器進程的多個窗口來併發訪問同一個WEB站點的多個FORM表單頁面時,將會出現表單無法正常提交的情況。
l 解決方案:
ü 將FORM表單的標識號作爲表單隱藏字段的名稱,如下所示:
<input type='hidden' name='4b15c6b2f573831b4b5107d849fcafb8' value=''>
ü 將所有的表單標識號存儲進一個Vector集合對象中,並將Vector集合對象存儲進Session域中。當表單提交時,先從Session域中取出Vector集合對象,然後再從Vector集合對象中逐一取出每個表單標識號作爲參數調用HttpServletRequest.getParameter方法,如果其中有一次調用的返回值不爲null,則接受並處理該表單數據,處理完後將該表單標識號從Vector集合對象中刪除。