posts - 75,comments - 83,trackbacks - 0
          用SERVLET過(guò)濾來(lái)實(shí)現(xiàn)權(quán)限控制

          簡(jiǎn)介

          過(guò)濾是SERVLET2。3規(guī)范新有的功能,目前TOMCAT4,WEBLOGIC7都已支持。它能實(shí)現(xiàn)很多以前使用不便或很難實(shí)現(xiàn)的功能,在產(chǎn)品體系中,我們可以很好地使用SERVLET過(guò)濾,使得各個(gè)部件可以在保持系統(tǒng)統(tǒng)一權(quán)限控制的前提下,來(lái)實(shí)現(xiàn)各個(gè)獨(dú)自的個(gè)性權(quán)限系統(tǒng)。

          下面先看下SERVLET過(guò)濾是如何工作的,如下圖

          優(yōu)點(diǎn)

          和傳統(tǒng)架構(gòu)相比,SERVLET過(guò)濾的優(yōu)點(diǎn)如下:

          在傳統(tǒng)架構(gòu)中:

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

          SERVLET過(guò)濾中:

          • 嵌套的方法調(diào)用通過(guò)一系列過(guò)濾器實(shí)現(xiàn),它僅有應(yīng)用于當(dāng)前請(qǐng)求的過(guò)濾器組成;基于掛鉤式調(diào)用的傳統(tǒng)執(zhí)行方式需要在處理短句中調(diào)用掛鉤式例程,即使一個(gè)特定短句的處理邏輯不起任何作用。
          • 局部變量在實(shí)際的過(guò)濾方法返回之前都作保留,并且可用(因?yàn)樯嫌芜^(guò)濾器的調(diào)用總在堆棧上,等待后續(xù)調(diào)用的返回)。

          過(guò)濾的實(shí)現(xiàn)

          調(diào)用鏈
          所有過(guò)濾器都服從調(diào)用的過(guò)濾器鏈,并通過(guò)定義明確的接口得到執(zhí)行。一個(gè)執(zhí)行過(guò)濾器的 Java 類必須執(zhí)行這一
          javax.servlet.Filter 接口。這一接口含有三個(gè)過(guò)濾器必須執(zhí)行的方法:

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

          嵌套調(diào)用在 doFilter() 方法執(zhí)行中發(fā)生。除非您建立一個(gè)過(guò)濾器明確阻止所有后續(xù)處理(通過(guò)其它過(guò)濾器及資源處理器),否則過(guò)濾器一定會(huì)在 doFilter 方法中作以下的調(diào)用:

          FilterChain.doFilter(request, response);

          ?

          安裝過(guò)濾器:定義與映射
          容器通過(guò) Web 應(yīng)用程序中

          的配置描述符 web.xml 文件了解過(guò)濾器。有兩個(gè)新的標(biāo)記與過(guò)濾器相關(guān):<filter><filter-mapping>。應(yīng)該指定它們?yōu)?span lang="EN-US"> web.xml 文件內(nèi) <web-app> 標(biāo)記的子標(biāo)記。

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

          1.首先寫一個(gè)權(quán)限過(guò)濾filter類,實(shí)現(xiàn)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");
          ????
          ????//判斷如果沒有取到用戶信息,就跳轉(zhuǎn)到登陸頁(yè)面
          ????if?(username?==?null?||?"".equals(username))?{
          ??????//跳轉(zhuǎn)到登陸頁(yè)面
          ??????res.sendRedirect("http://"+req.getHeader("Host")+"/login.jsp");
          ????}
          ????else?{
          ??????//已經(jīng)登陸,繼續(xù)此次請(qǐng)求
          ??????chain.doFilter(request,response);
          ????}
          ??}

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

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

          <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.如果是某一個(gè)目錄(如a/目錄)整個(gè)目錄下的文件都需要登陸驗(yàn)證:

          <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 梓楓 閱讀(9676) 評(píng)論(9)  編輯  收藏

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 龙门县| 紫阳县| 高青县| 兴海县| 尤溪县| 大丰市| 武功县| 杨浦区| 石门县| 昆明市| 杂多县| 张家口市| 永城市| 澄迈县| 自贡市| 安阳市| 监利县| 武义县| 长泰县| 游戏| 麦盖提县| 安乡县| 全椒县| 长白| 永修县| 元氏县| 吴川市| 温州市| 南溪县| 灵丘县| 汝州市| 阿图什市| 石台县| 县级市| 巴马| 南开区| 连山| 武安市| 枝江市| 雷州市| 龙川县|