Servlet中的filter過濾器

轉載並修改自:html

  http://blog.csdn.net/lip009/archive/2006/10/17/1337730.aspx       http://tech.sina.com.cn/s/2009-11-19/00471138968.shtmljava

@Servlet裏的過濾器的主要做用web

1,任何系統或網站都要判斷用戶是否登陸。cookie

2,網絡聊天系統或論壇,功能是過濾非法文字網絡

3,統一解決編碼session

@Servlet3.0以前怎麼建立一個過濾器app

1,生成一個普通的class類,實現Filter接口(javax.servlet.Filter)異步

2,重寫接口裏面的三個方法:init,doFilter,destroy。jsp

   其中的doFilter方法的第一個參數爲ServletRequest對象。此對象給過濾器提供了對進入的信息(包括表單數據、cookie和HTTP請求頭)的徹底訪問。第二個參數爲ServletResponse,一般在簡單的過濾器中忽略此參數。最後一個參數爲FilterChain,此參數用來調用servlet或JSP頁。async

3,而後在web.xml配置過濾器。

具體例子: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;
     //若是處理HTTP請求,而且須要訪問諸如getHeader或getCookies等在ServletRequest中沒法獲得的方法
     //就要把此request對象構形成HttpServletRequest
    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);
       //調用FilterChain對象的doFilter方法
       //Filter接口的doFilter方法取一個FilterChain對象做爲它的一個參數
       //在調用此對象的doFilter方法時,激活下一個相關的過濾器
       //若是沒有另外一個過濾器與servlet或JSP頁面關聯,則servlet或JSP頁面被激活
    }

  }


  
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 >

 

@Servlet3.0中的建立過濾器:使用@WebFilter

@WebFilter用於將一個類聲明爲過濾器,該註解將會在部署時被容器處理,容器將根據具體的屬性配置將相應的類部署爲過濾器。該註解具備下表給出的一些經常使用屬性(如下全部屬性均爲可選屬性,可是value、urlPatterns、servletNames三者必需至少包含一個,且value和urlPatterns不能共存,若是同時指定,一般忽略value的取值):

屬性名類型描述

1.filterNameString指定過濾器的name屬性。

2.valueString[]該屬性等價於urlPatterns屬性。可是二者不該該同時使用。

3.urlPatternsString[]指定一組過濾器的URL匹配模式。等價於標籤。

4.servletNamesString[]指定過濾器將應用於哪些Servlet。取值是@WebServlet中的name屬性的取值,或者是web.xml中的取值。

5.dispatcherTypesDispatcherType指定過濾器的轉發模式。具體取值包括:

   ◆ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。

   ◆initParamsWebInitParam[]指定一組過濾器初始化參數,等價於標籤。

   ◆asyncSupportedboolean聲明過濾器是否支持異步操做模式,等價於標籤。

   ◆descriptionString該過濾器的描述信息,等價於標籤。

   ◆displayNameString該過濾器的顯示名,一般配合工具使用,等價於標籤。

一個簡單的示例:

@WebFilter(filterName = "AuthenticateFilter", urlPatterns ={"/stock.jsp""/getquote"})
public class AuthenticateFilter implements Filter {
    
public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)     
throws IOException, ServletException {
        String username 
= ((HttpServletRequest) request).getParameter("uname");
        String password 
= ((HttpServletRequest) request).getParameter("password");
        
if (username == null || password == null) {
                 ((HttpServletResponse) response).sendRedirect(
"index.jsp");            

        } 
        if (username.equals("admin"&& password.equals("admin")) {
                chain.doFilter(request, response);      

        } else {
                ((HttpServletResponse) response).sendRedirect(
"index.jsp");        

        }
    }
    
public void destroy() {
    }

    public void init(FilterConfig filterConfig) {
    }
}

如此配置以後,就能夠沒必要在web.xml中配置相應的和元素了,容器會在部署時根據指定的屬性將該類發佈爲過濾器。

 

具體Servlet3.0相關的內容請參考:http://blog.csdn.net/flfna/archive/2010/05/16/5598201.aspx

相關文章
相關標籤/搜索