posts - 75,comments - 83,trackbacks - 0
          用SERVLET過濾來實現權限控制

          簡介

          過濾是SERVLET23規范新有的功能,目前TOMCAT4WEBLOGIC7都已支持。它能實現很多以前使用不便或很難實現的功能,在產品體系中,我們可以很好地使用SERVLET過濾,使得各個部件可以在保持系統統一權限控制的前提下,來實現各個獨自的個性權限系統。

          下面先看下SERVLET過濾是如何工作的,如下圖

          優點

          和傳統架構相比,SERVLET過濾的優點如下:

          在傳統架構中:

          • 每次接受到請求,掛鉤式方法就被調用,不論它們是否執行(有時甚至是空的)。
          • 方法的作用域及并發關系(每個方法可能在不同的線程上被調用)不允許在處理相同的請求時簡單、高效地共享不同掛鉤式方法調用間的變量和信息。

          SERVLET過濾中:

          • 嵌套的方法調用通過一系列過濾器實現,它僅有應用于當前請求的過濾器組成;基于掛鉤式調用的傳統執行方式需要在處理短句中調用掛鉤式例程,即使一個特定短句的處理邏輯不起任何作用。
          • 局部變量在實際的過濾方法返回之前都作保留,并且可用(因為上游過濾器的調用總在堆棧上,等待后續調用的返回)。

          過濾的實現

          調用鏈
          所有過濾器都服從調用的過濾器鏈,并通過定義明確的接口得到執行。一個執行過濾器的 Java 類必須執行這一
          javax.servlet.Filter 接口。這一接口含有三個過濾器必須執行的方法:

          • doFilter(ServletRequest, ServletResponse, FilterChain):這是一個完成過濾行為的方法。這同樣是上游過濾器調用的方法。引入的FilterChain對象提供了后續過濾器所要調用的信息。
          • init(FilterConfig):這是一個容器所調用的初始化方法。它保證了在第一次doFilter()調用前由容器調用。您能獲取在 web.xml 文件中指定的初始化參數。
          • destroy():容器在破壞過濾器實例前,doFilter()中的所有活動都被該實例終止后,調用該方法。

          嵌套調用在 doFilter() 方法執行中發生。除非您建立一個過濾器明確阻止所有后續處理(通過其它過濾器及資源處理器),否則過濾器一定會在 doFilter 方法中作以下的調用:

          FilterChain.doFilter(request, response);

          ?

          安裝過濾器:定義與映射
          容器通過 Web 應用程序中

          的配置描述符 web.xml 文件了解過濾器。有兩個新的標記與過濾器相關:<filter><filter-mapping>。應該指定它們為 web.xml 文件內 <web-app> 標記的子標記。

          過濾器定義的元素
          <filter> 標記是一個過濾器定義,它必定有一個 <filter- name><filter-class> 子元素。<filter-name> 子元素給出了一個與過濾器實例相關的、基于文本的名字。<filter-class> 指定了由容器載入的實際類。您能隨意地包含一個 <init-param> 子元素為過濾器實例提供初始化參數。例如,下面的過濾器定義指定了一個叫做 IE Filter 的過濾器:

          1.首先寫一個權限過濾filter類,實現Filter接口

          import?javax.servlet.Filter;
          import?javax.servlet.FilterConfig;
          import?javax.servlet.ServletException;
          import?javax.servlet.ServletRequest;
          import?javax.servlet.ServletResponse;
          import?javax.servlet.FilterChain;
          import?java.io.IOException;
          import?javax.servlet.http.HttpServletRequest;
          import?javax.servlet.http.HttpSession;
          import?javax.servlet.http.HttpServletResponse;

          public?class?RightFilter
          ????implements?Filter?{
          ??public?void?init(FilterConfig?filterConfig)?throws?ServletException?{
          ??}

          ??public?void?doFilter(ServletRequest?request,?ServletResponse?response,
          ???????????????????????FilterChain?chain)?throws?IOException,?ServletException?{
          ????HttpServletRequest?req?=?(HttpServletRequest)?request;
          ????HttpServletResponse?res?=?(HttpServletResponse)?response;
          ????
          ????HttpSession?session?=?req.getSession(true);

          ????//從session里取的用戶名信息
          ????String?username?=?(String)?session.getAttribute("username");
          ????
          ????//判斷如果沒有取到用戶信息,就跳轉到登陸頁面
          ????if?(username?==?null?||?"".equals(username))?{
          ??????//跳轉到登陸頁面
          ??????res.sendRedirect("http://"+req.getHeader("Host")+"/login.jsp");
          ????}
          ????else?{
          ??????//已經登陸,繼續此次請求
          ??????chain.doFilter(request,response);
          ????}
          ??}

          ??public?void?destroy()?{
          ??}
          }?

          2.然后在web.xml里配置需要登陸權限驗證的JSP文件:???
          ?a.如果是某個具體的JSP文件(如a.jsp)需要登陸驗證

          <web-app>
          ??
          ??
          <filter>
          ????
          <filter-name>right</filter-name>
          ????
          <filter-class>com.taihuatalk.taihua.common.RightFilter</filter-class>
          ??
          </filter>

          ??
          <filter-mapping>
          ????
          <filter-name>right</filter-name>
          ????
          <url-pattern>/a.jsp</url-pattern>
          ??
          </filter-mapping>
          ??
          </web-app>

          ?? b.如果是某一個目錄(如a/目錄)整個目錄下的文件都需要登陸驗證:

          <web-app>
          ??
          ??
          <filter>
          ????
          <filter-name>right</filter-name>
          ????
          <filter-class>com.taihuatalk.taihua.common.RightFilter</filter-class>
          ??
          </filter>

          ??
          <filter-mapping>
          ????
          <filter-name>right</filter-name>
          ????
          <url-pattern>/a/*</url-pattern>
          ??</filter-mapping>
          ??
          </web-app>
          posted on 2008-03-31 15:27 梓楓 閱讀(9668) 評論(9)  編輯  收藏

          FeedBack:
          # re: 使用filter過濾器實現登陸權限驗證
          2008-12-20 13:34 | 阿星
          很好 通俗易懂,謝謝了!  回復  更多評論
            
          # re: 使用filter過濾器實現登陸權限驗證 [未登錄]
          2009-01-01 20:55 | sky
          不錯,簡單易懂,謝了  回復  更多評論
            
          # re: 使用filter過濾器實現登陸權限驗證 [未登錄]
          2009-05-11 16:18 | abc
          你這個好像只能驗證訪問a.jsp頁面的驗證,其它頁面不行  回復  更多評論
            
          # re: 使用filter過濾器實現登陸權限驗證
          2009-06-06 03:48 | 蝴蝶世界
          我想玩地下城與勇士  回復  更多評論
            
          # re: 使用filter過濾器實現登陸權限驗證
          2009-06-13 11:04 | wc
          根據具體的web 請求進行過濾
          很好的舉例  回復  更多評論
            
          # re: 使用filter過濾器實現登陸權限驗證
          2010-09-19 14:35 | t
          這寫的有問題  回復  更多評論
            
          # re: 使用filter過濾器實現登陸權限驗證 [未登錄]
          2010-10-27 11:57 | dd
          xiexie  回復  更多評論
            
          # : 使用filter過濾器實現登陸權限驗證 [未登錄]
          2011-08-10 16:24 | 菜鳥
          .如果是某一個目錄(如a/目錄)整個目錄下的文件都需要登陸驗證:
          有問題!
          測試過了  回復  更多評論
            
          # re: 使用filter過濾器實現登陸權限驗證
          2013-04-08 21:27 | 空氣過濾器www.iguolvqi.com
          嵌套的方法調用通過一系列過濾器實現,它僅有應用于當前請求的過濾器組成;基于掛鉤式調用的傳統執行方式需要在處理短句中調用掛鉤式例程,即使一個特定短句的處理邏輯不起任何作用。
          局部變量在實際的過濾方法返回之前都作保留,并且可用(因為上游過濾器的調用總在堆棧上,等待后續調用的返回)  回復  更多評論
            

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


          網站導航:
           
          主站蜘蛛池模板: 错那县| 嘉黎县| 乌拉特中旗| 惠安县| 土默特左旗| 潼南县| 毕节市| 栾城县| 西吉县| 定安县| 龙泉市| 黎城县| 南华县| 松江区| 巩留县| 邵东县| 杭锦旗| 无棣县| 洛浦县| 七台河市| 威宁| 穆棱市| 龙陵县| 九江市| 灌阳县| 吐鲁番市| 鹤岗市| 封开县| 修文县| 祥云县| 灵武市| 尖扎县| 白朗县| 黎平县| 梧州市| 饶河县| 保亭| 漯河市| 洮南市| 姚安县| 社旗县|