重定向請求
下面我們來構(gòu)造一個AuthenticationFilter過濾器,它的功能是截獲對Controller Servlet的請求,然后驗證用戶的身份。按照前面介紹的步驟用向?qū)?chuàng)建過濾器時,向?qū)峁┝硕x初始化參數(shù)、過濾器的URL和Servlet映射等參數(shù)。如果不設(shè)置這類參數(shù),缺省情況下向?qū)в眠^濾器本身的名稱創(chuàng)建一個URL映射,我們將在下面用編輯web.xml文件的方式定義映射,因此現(xiàn)在先認可缺省值。注意,如果你想在鏈中使用一個以上的過濾器,那就必須手工編輯web.xml。
在向?qū)е悬c擊“完成”按鈕后,WSAD立即構(gòu)造出過濾器的骨架代碼。對于本例來說,接下來我們唯一的任務就是將代碼插入doFilter()方法,如Listing 1所示。
// Listing 1: AuthenticationFilter.java
public void doFilter(
ServletRequest req,
ServletResponse resp,
FilterChain chain)
throws ServletException, IOException {
String nextPage;
RequestDispatcher rd = null;
//檢查用戶名稱和密碼
if (req.getParameter("userid") != null) {
if (!((req.getParameter("password").equals("password"))
&& (req.getParameter("userid").equals("user")))) {
ArrayList actionreport = newArrayList();
actionreport.add("登錄失敗。。。");
(((HttpServletRequest) req).getSession()).setAttribute(
"actionreport", actionreport);
nextPage = "failure.jsp";
System.out.println("獲得了來自過濾器的應答。");
// 將請求直接傳遞給下一個頁面(而不是Controller Servlet)
rd = req.getRequestDispatcher(nextPage);
rd.forward(req, resp);
} else {
req.setAttribute("login", "loginsuccess");
// 將請求傳遞給Controller Servlet
chain.doFilter(req, resp);
System.out.println("獲得了來自過濾器的應答。");
}
} else {
rd = req.getRequestDispatcher("Welcome.jsp");
rd.forward(req, resp);
}
} |
從上面的代碼可以看出,在過濾器中驗證用戶身份的方式仍和平常的一樣。在此過程中,為了獲得session對象,我們把ServletRequest定型(cast)成了HttpServletRequest。如果用戶未能通過身份驗證,我們不再把請求傳遞給Controller Servlet,而是通過RequestDispatcher把請求傳遞給報告頁面(failure.jsp)。
如果用戶通過了身份驗證,則我們調(diào)用chain.doFilter(),允許應答進入Controller——這是因為調(diào)用chain.doFilter()時,鏈里面已經(jīng)沒有其他過濾器,所以控制將以POST方式轉(zhuǎn)入作為Controller的Servlet,實際上,chain.doFilter()將調(diào)用Controller.doPost()方法。
發(fā)送請求給Controller之前,我們可以根據(jù)用戶獲得的身份證書來設(shè)置請求的屬性,這些信息將幫助Controller及其輔助類處理請求。作為一個例子,我們設(shè)置了請求的login屬性,然后在Controller中檢查該屬性,Controller把應答返回給success.jsp(如Listing 2所示)。
// Listing 2: controller.java
protected final void doPost(
HttpServletRequest request,
HttpServletResponse response) {
// begining codes
//--用戶已通過身份驗證
if (((String) request.getAttribute("login")).equals
("login success")) {
ArrayList actionreport = new ArrayList();
actionreport.add("Correct Password");
session.setAttribute("actionreport", actionreport);
nextPage = "success.jsp";
}
if (dispatch) {
RequestDispatcher rd =
getServletContext().getRequestDispatcher(nextPage);
rd.forward(request, response);
} else {
session.invalidate();
}
// ending codes
} |
posted on 2005-09-12 16:27
my java 閱讀(3100)
評論(1) 編輯 收藏