posts - 23,comments - 12,trackbacks - 0
          重定向請求

            下面我們來構造一個AuthenticationFilter過濾器,它的功能是截獲對Controller Servlet的請求,然后驗證用戶的身份。按照前面介紹的步驟用向導創建過濾器時,向導提供了定義初始化參數、過濾器的URL和Servlet映射等參數。如果不設置這類參數,缺省情況下向導用過濾器本身的名稱創建一個URL映射,我們將在下面用編輯web.xml文件的方式定義映射,因此現在先認可缺省值。注意,如果你想在鏈中使用一個以上的過濾器,那就必須手工編輯web.xml。

            在向導中點擊“完成”按鈕后,WSAD立即構造出過濾器的骨架代碼。對于本例來說,接下來我們唯一的任務就是將代碼插入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)。

            如果用戶通過了身份驗證,則我們調用chain.doFilter(),允許應答進入Controller——這是因為調用chain.doFilter()時,鏈里面已經沒有其他過濾器,所以控制將以POST方式轉入作為Controller的Servlet,實際上,chain.doFilter()將調用Controller.doPost()方法。

            發送請求給Controller之前,我們可以根據用戶獲得的身份證書來設置請求的屬性,這些信息將幫助Controller及其輔助類處理請求。作為一個例子,我們設置了請求的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 閱讀(3101) 評論(1)  編輯  收藏

          FeedBack:
          # re: AuthenticationFilter過濾器[未登錄]
          2014-11-10 17:27 | dd
          ddddddddddddddd  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 东阳市| 西华县| 阳信县| 沧源| 武功县| 闻喜县| 南城县| 武山县| 满洲里市| 灵川县| 石棉县| 扶沟县| 长丰县| 泌阳县| 石城县| 东阳市| 石景山区| 房产| 山东省| 贵定县| 庆云县| 平陆县| 商城县| 图木舒克市| 申扎县| 襄垣县| 蚌埠市| 郁南县| 五台县| 勃利县| 潜江市| 贵定县| 合山市| 九龙县| 镇安县| 皋兰县| 潼关县| 兴文县| 津市市| 盐城市| 依兰县|