Session購物車、防止表單重複提交

 一,使用Session實現購物車

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集合對象中刪除。

     

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章