posts - 23,comments - 12,trackbacks - 0
          <2005年9月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          常用鏈接

          留言簿(1)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          收藏夾

          java

          javascript

          設(shè)計(jì)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          重定向請(qǐng)求

            下面我們來(lái)構(gòu)造一個(gè)AuthenticationFilter過(guò)濾器,它的功能是截獲對(duì)Controller Servlet的請(qǐng)求,然后驗(yàn)證用戶(hù)的身份。按照前面介紹的步驟用向?qū)?chuàng)建過(guò)濾器時(shí),向?qū)峁┝硕x初始化參數(shù)、過(guò)濾器的URL和Servlet映射等參數(shù)。如果不設(shè)置這類(lèi)參數(shù),缺省情況下向?qū)в眠^(guò)濾器本身的名稱(chēng)創(chuàng)建一個(gè)URL映射,我們將在下面用編輯web.xml文件的方式定義映射,因此現(xiàn)在先認(rèn)可缺省值。注意,如果你想在鏈中使用一個(gè)以上的過(guò)濾器,那就必須手工編輯web.xml。

            在向?qū)е悬c(diǎn)擊“完成”按鈕后,WSAD立即構(gòu)造出過(guò)濾器的骨架代碼。對(duì)于本例來(lái)說(shuō),接下來(lái)我們唯一的任務(wù)就是將代碼插入doFilter()方法,如Listing 1所示。

          // Listing 1: AuthenticationFilter.java
          
              public void doFilter(
                  ServletRequest req,
                  ServletResponse resp,
                  FilterChain chain)
                  throws ServletException, IOException {
          
                  String nextPage;
                  RequestDispatcher rd = null;
                  //檢查用戶(hù)名稱(chēng)和密碼
                  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("獲得了來(lái)自過(guò)濾器的應(yīng)答。");
                          // 將請(qǐng)求直接傳遞給下一個(gè)頁(yè)面(而不是Controller Servlet)
                          rd = req.getRequestDispatcher(nextPage);
                          rd.forward(req, resp);
                      } else {
                          req.setAttribute("login", "loginsuccess");
                          // 將請(qǐng)求傳遞給Controller Servlet
                          chain.doFilter(req, resp);
                          System.out.println("獲得了來(lái)自過(guò)濾器的應(yīng)答。");
                      }
                  } else {
                      rd = req.getRequestDispatcher("Welcome.jsp");
                      rd.forward(req, resp);
                  }
              }


            從上面的代碼可以看出,在過(guò)濾器中驗(yàn)證用戶(hù)身份的方式仍和平常的一樣。在此過(guò)程中,為了獲得session對(duì)象,我們把ServletRequest定型(cast)成了HttpServletRequest。如果用戶(hù)未能通過(guò)身份驗(yàn)證,我們不再把請(qǐng)求傳遞給Controller Servlet,而是通過(guò)RequestDispatcher把請(qǐng)求傳遞給報(bào)告頁(yè)面(failure.jsp)。

            如果用戶(hù)通過(guò)了身份驗(yàn)證,則我們調(diào)用chain.doFilter(),允許應(yīng)答進(jìn)入Controller——這是因?yàn)檎{(diào)用chain.doFilter()時(shí),鏈里面已經(jīng)沒(méi)有其他過(guò)濾器,所以控制將以POST方式轉(zhuǎn)入作為Controller的Servlet,實(shí)際上,chain.doFilter()將調(diào)用Controller.doPost()方法。

            發(fā)送請(qǐng)求給Controller之前,我們可以根據(jù)用戶(hù)獲得的身份證書(shū)來(lái)設(shè)置請(qǐng)求的屬性,這些信息將幫助Controller及其輔助類(lèi)處理請(qǐng)求。作為一個(gè)例子,我們?cè)O(shè)置了請(qǐng)求的login屬性,然后在Controller中檢查該屬性,Controller把應(yīng)答返回給success.jsp(如Listing 2所示)。

          // Listing 2: controller.java
          
          protected final void doPost(
              HttpServletRequest request,
              HttpServletResponse response) {
          
              // begining codes
              //--用戶(hù)已通過(guò)身份驗(yàn)證
              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 閱讀(3106) 評(píng)論(1)  編輯  收藏

          FeedBack:
          # re: AuthenticationFilter過(guò)濾器[未登錄](méi)
          2014-11-10 17:27 | dd
          ddddddddddddddd  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 呈贡县| 黎城县| 汽车| 方城县| 法库县| 华亭县| 仁化县| 乡宁县| 宝丰县| 玛多县| 峡江县| 长寿区| 大方县| 达尔| 额敏县| 宁陵县| 许昌县| 莱芜市| 睢宁县| 平舆县| 监利县| 浮梁县| 宁国市| 清苑县| 特克斯县| 广灵县| 嘉黎县| 全南县| 和平区| 依兰县| 大港区| 林州市| 科尔| 锡林郭勒盟| 中阳县| 仁布县| 黑河市| 仙游县| 泰宁县| 绥阳县| 宜宾市|