程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JBuilder2005 Servlet開發之程序改造

JBuilder2005 Servlet開發之程序改造

編輯:關於JAVA

原登錄模塊的不足

在JBuilder 2005實戰JSP開發專題中,我們完全用JSP技術實現了一個用戶登錄模塊。它提供了一個登錄的頁面,在用戶登錄成功後轉向歡迎頁面,而登錄失敗後轉向登錄失敗的頁面,並且為每個頁面提供了一個錯誤處理頁面,當功能頁面發生錯誤時,以一種友好的方式向用戶報告錯誤。但這個模塊還存在一些問題:

問題一:沒有在每個JSP頁面檢驗用戶是否有登錄

Web應用程序的JSP頁面幾乎都需要在驗證用戶的身份之後才可以訪問,也即必須保證JSP頁面處理請求之前用戶已經確實登錄系統了,否則應該拒絕響應並重定向到登錄頁面。不然如果一個非法的用戶直接通過URL訪問JSP頁面,就會產生系統安全性問題。

我們舉一個例子:如果有一個用戶直接通過http://localhost:8080/webModule/welcome.jsp訪問welcome.jsp界面,我們必須先判斷用戶有沒有登錄(通過查看session中是否有以"ses_userBean"命名的對象),如果已經登錄,打開welcome.jsp頁面,如果沒有登錄重定向login.jsp登錄頁面。

提示:

當然更正規的作法應該是通過web.XML配置文件的<security-constraint>等配置項按角色對Web資源的訪問權限進行配置,但這種方式確實是比較麻煩的。所以我們一般采用在每一個請求到達處理程序前判斷用戶的登錄信息的方式處理頁面訪問權限的問題。 為了達到防止非法用戶訪問功能頁面的目的,你當然可以像勞模一樣在每一個需要保護的JSP頁面中添加一段如下的判斷代碼加以解決:

1.<%
2.if(session.getAttribute("ses_userBean") == null)
3.{
4.response.sendRedirect("/webModule/login.jsp");
5.}
6.%>

但對於一個擁有成百上千個需保護JSP頁面的大型Web應用程序,在每一個頁面中添加這段相同的代碼,不但單調乏味,違反面向對象的宗旨,而且容易出現漏網之魚。在本專題中,我們將通過一個Servlet過濾器輕松漂亮地完成這個任務。

問題二:每次生成login.jsp頁面用戶列表時都重新訪問數據庫

一般而言,Web應用程序的用戶是不常發生變化的,但login.jsp頁面的用戶列表卻在每次刷新時都從數據庫表中獲取用戶數據並生成下拉列表。假設我們這個Web應用系統的用戶數據(密碼除外)不發生變化,那麼我們就可以在Web應用程序啟動時,就將用戶Id和用戶名下載緩存在Web應用服務器的內存中,這樣每次在生成登錄頁面的用戶名下拉框時,就不需要重新到數據庫表中獲取,而直接從Web應用服務器的內存中獲取,在性能和效率上都會有極大的提高。

當然,將用戶緩存在Web應用服務器中可能並不是很恰當,而諸如學歷、性別、民族等字典表更適合緩存。對於那些不會或很少發生更改的數據、不應該每次都從數據庫中獲取,因為訪問數據庫的操作是高代價的操作,需要較多的I/O操作,CPU時間和網絡通訊,在可能的情況下,應該盡量減少訪問數據庫的次數,這也是值對象設計模式的精髓所在。這裡我們對用戶數據進行緩存只是為了描述一種提高性能的解決思路。

本專題中,我們通過一個自動啟動的Servlet改造生成用戶列表的功能:在Web應用程序啟動時,就通過這個Servlet將用戶Id和用戶名緩存到Web應用服務器中,生成下拉框的用戶數據直接從緩存中讀取。

新增的若干功能點

此外,我們還利用Servlet技術向原應用程序中加入兩個新的功能作為系統日志模塊:

功能一:添加一個Web容器的監聽器的Servlet

在本專題中,我們將創建一個Servlet監聽器,監聽Web容器啟動和關閉事件,在事件處理方法中記錄系統啟動和關閉系統事件的日志,日志以Excel文件格式保存。

功能二:通過一個Servlet下載文件

Servlet通過設置輸出文件頭參數向客戶端返回各種類型的響應,如HTML、XML、WML等文本格式或聲音、圖像、Excel文件等二進制流格式。此外,還可以通過設置輸出文件頭參數使Servlet生成一個用於下載的文件。我們將通過一個Servlet下載Web應用程序的系統日志。

事前准備

通過File->New Project...新創建一個名為bookStore的工程,並在工程下創建名為webModule的Web模塊,將原《JBuilder 2005實戰JSP開發》專題的舊的bookStore工程源碼拷貝到新的bookStore的工程目錄下覆對應的目錄。

此外,你還需要維護bookStore工程的類庫,使其包含Oracle驅動器的JAR包和時間標簽的JAR包,上一個專題已有提及此處從略。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved