<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我思故我強

    使用filter過濾請求

    package anni;
    public class EncodingFilter implements Filter {
    ??? public void init(FilterConfig config) throws ServletException {}
    ??? public void destroy() {}
    ??? public void doFilter(ServletRequest request,
    ??????????? ServletResponse response,
    ??????????? FilterChain chain)
    ??????????? throws IOException, ServletException {
    ??????? request.setCharacterEncoding("gb2312");
    ??????? chain.doFilter(request, response);
    ??? }
    }

    web.xml中
    <filter>
    ??? <filter-name>EncodingFilter</filter-name>
    ??? <filter-class>anni.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
    ??? <filter-name>EncodingFilter</filter-name>
    ??? <url-pattern>/*</url-pattern>
    </filter-mapping>

    filter標簽部分定義使用的過濾器,filter-mapping標簽告訴服務器把哪些請求交給過濾器處理。這里的/*表示所有請求,/表示根路徑,*(星號)代表所有請求,加在一起就變成了根路徑下的所有請求。這樣,所有的請求都會先被EncodingFilter攔截,并在請求里設置上指定的gb2312編碼。

    ================================
    用filter控制用戶訪問權限

    我們要保護的頁面是admin/index.jsp,為此我們在web.xml進行如下配置。
    <filter>
    ??? <filter-name>SecurityFilter</filter-name>
    ??? <filter-class>anni.SecurityFilter</filter-class>
    </filter>
    <filter-mapping>
    ??? <filter-name>SecurityFilter</filter-name>
    ??? <url-pattern>/admin/*</url-pattern>
    </filter-mapping>

    SecurityFilter過濾器:
    public void doFilter(ServletRequest request,
    ??????? ServletResponse response,
    ??????? FilterChain chain)
    ??????? throws IOException, ServletException {
    ??? HttpServletRequest req = (HttpServletRequest) request;
    ??? HttpServletResponse res = (HttpServletResponse) response;
    ?? HttpSession session = req.getSession();
    ??? if (session.getAttribute("username") != null) {
    ??????? chain.doFilter(request, response);
    ??? } else {
    ??????? res.sendRedirect("../failure.jsp");
    ??? }
    }

    首先要將ServletRequest和ServletResponse轉換成HttpServletRequest和HttpServletResponse,因為Filter本來設計成為多種協議服務,http協議僅僅是其中一部分。不過我們接觸到的也只有http,而且也只有轉換成對應HttpServletRequest和HttpServletResponse才能進行下面的session操作和頁面重定向。
    得到了http請求之后,可以獲得請求對應的session,判斷session中的username變量是否為null,如果不為null,說明用戶已經登錄,就可以調用doFilter繼續請求訪問的資源。如果為null,說明用戶還沒有登錄,禁止用戶訪問,并使用頁面重定向跳轉到failure.jsp頁面顯示提示信息。

    ==================================
    filter所謂的特性

    請求映射
    filter-mapping和servlet-mapping都是將對應的filter或servlet映射到某個url-pattern上,當客戶發起某一請求時,服務器先將此請求與web.xml中定義的所有url-pattern進行匹配,然后執行匹配通過的filter和servlet。

    你可以使用三種方式定義url-pattern。
    1.直接映射一個請求。
    <servlet-mapping>
    ??? <servlet-name>ContactServlet</servlet-name>
    ??? <url-pattern>/contact.do</url-pattern>
    </servlet-mapping>
    ???????????????????
    2.映射一個路徑下的所有請求。
    <servlet-mapping>
    ??? <servlet-name>EncodingFilter</servlet-name>
    ??? <url-pattern>/*</url-pattern>
    </servlet-mapping>

    3.映射結尾相同的一類請求。
    <servlet-mapping>
    ??? <servlet-name>ControllerServlet</servlet-name>
    ??? <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    想要獲得所有以user開頭.do結尾的請求嗎?user*.do在url-pattern是無法識別的,只能配置成*.do,再去servlet中對請求進行篩選。
    想要讓一個servlet負責多個請求嗎?/user/*,/admin/*,*.do寫在一起url-pattern也不認識,只能配成多個servlet-mapping。
    <servlet-mapping>
    ??? <servlet-name>ControllerServlet</servlet-name>
    ??? <url-pattern>/user/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
    ??? <servlet-name>ControllerServlet</servlet-name>
    ??? <url-pattern>/admin/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
    ??? <servlet-name>ControllerServlet</servlet-name>
    ??? <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    過濾鏈

    服務器會按照web.xml中過濾器定義的先后循序組裝成一條鏈,然后一次執行其中的doFilter()方法。執行的順序就如上圖所示,執行第一個過濾器的chain.doFilter()之前的代碼,第二個過濾器的chain.doFilter()之前的代碼,請求的資源,第二個過濾器的chain.doFilter()之后的代碼,第一個過濾器的chain.doFilter()之后的代碼,最后返回響應。
    過濾鏈的好處是,執行過程中任何時候都可以打斷,只要不執行chain.doFilter()就不會再執行后面的過濾器和請求的內容。而在實際使用時,就要特別注意過濾鏈的執行順序問題,像EncodingFilter就一定要放在所有Filter之前,這樣才能確保在使用請求中的數據前設置正確的編碼。

    filter的詳細配置

    在servlet-2.3中,Filter會過濾一切請求,包括服務器內部使用forward轉發請求和<%@ include file="/index.jsp"%>的情況。
    到了servlet-2.4中Filter默認下只攔截外部提交的請求,forward和include這些內部轉發都不會被過濾,但是有時候我們需要forward的時候也用到Filter,這樣就需要如下配置。
    <filter>
    ??? <filter-name>TestFilter</filtername>
    ??? <filter-class>anni.TestFilter</filter-class>
    </filter>
    <filter-mapping>
    ??? <filter-name>TestFilter</filtername>
    ??? <url-pattern>/*</url-pattern>
    ??? <dispatcher>REQUEST</dispatcher>
    ??? <dispatcher>FORWARD</dispatcher>
    ??? <dispatcher>INCLUDE</dispatcher>
    ??? <dispatcher>EXCEPTION</dispatcher>
    </filter-mapping>
    ???????
    這樣TestFilter就會過濾所有狀態下的請求。如果我們沒有進行設置,默認使用的就是REQUEST。而EXCEPTION是在isErrorPage="true"的情況下出現的,這個用處不多,看一下即可。
    這里FORWARD是解決request.getDispatcher("index.jsp").forward(request, response);無法觸發Filter的關鍵,配置上這個以后再進行forward的時候就可以觸發過濾器了。

    Filter還有一個有趣的用法,在filter-mapping中我們可以直接指定servlet-mapping,讓過濾器只處理一個定義在web.xml中的servlet。
    <filter-mapping>
    ??? <filter-name>TestFilter</filter-name>
    ??? <servlet-name>TestServlet</servlet-name>
    </filter-mapping>
    <servlet>
    ??? <servlet-name>TestServlet</servlet-name>
    ??? <servlet-class>anni.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    ??? <servlet-name>TestServlet</servlet-name>
    ??? <url-pattern>/TestServlet</url-pattern>
    </servlet-mapping>
    ??????
    直接指定servlet-name,TestFilter便會引用TestServlet配置的url-pattern,在某些filter與servlet綁定的情況下不失為一個好辦法。

    posted on 2008-07-29 16:26 李云澤 閱讀(2048) 評論(0)  編輯  收藏 所屬分類: J2EE

    主站蜘蛛池模板: 亚洲高清无码综合性爱视频| 在线免费视频一区二区| 亚洲精品高清在线| 精品成人一区二区三区免费视频| 免费精品一区二区三区在线观看 | 久久一区二区三区免费| 亚洲av午夜成人片精品电影| 激情婷婷成人亚洲综合| 国产精品无码一二区免费| 色噜噜的亚洲男人的天堂| 国产国产人免费人成免费视频| 国产成人精品亚洲| 亚洲一区日韩高清中文字幕亚洲 | 可以免费观看一级毛片黄a| 国产成人不卡亚洲精品91| 亚洲国产成人久久综合碰| 中文字幕免费在线看线人动作大片| 亚洲色自偷自拍另类小说| 精品国产免费一区二区三区香蕉 | 免费在线观看自拍性爱视频| 亚洲裸男gv网站| 国产精品免费大片| 亚洲高清一区二区三区| 亚洲精品国产福利一二区| a级午夜毛片免费一区二区| 久久亚洲国产精品成人AV秋霞| 久久99九九国产免费看小说| 亚洲成a人无码亚洲成www牛牛 | 香蕉视频在线观看亚洲| 免费观看成人毛片a片2008| 色天使色婷婷在线影院亚洲| 亚洲日韩精品一区二区三区无码 | 免费视频精品一区二区三区| 亚洲一卡二卡三卡四卡无卡麻豆| 日韩毛片无码永久免费看| av片在线观看永久免费| 亚洲国产精品美女| 亚洲午夜精品一级在线播放放| 午夜爽爽爽男女免费观看影院 | 视频免费1区二区三区| 亚洲A∨无码无在线观看|