在web應用中實施過濾是我們常用的技術,通過過濾,可以對請求進行統一編碼,對請求進行認證等.每個Fillter可能只擔任很少的任務,多個Filter可以互相協作,通過這種協作,可以完成一個復雜的功能.
Fileter
聲明: public interface Filter
它是Filter必須實現的接口,它包含一下的方法
. init(FilterConfig config): 這個方法初始化Filter.
. doFilter(ServletRequest request,ServletResponse,FilterChain chain): Filter的業務方法就在這里實現.
. destory(): 釋放Filter占用的資源.
FilterChain
聲明: public interface FilterChain
它是代碼的過濾鏈,通過這個接口把過濾的任務在不同的Filter之間轉移.它包含一個方法:
doFilter(ServletRequest,request,ServletResponse response)
通過這個方法來調用下一下Filter,如果沒有嚇一個Filter,那么將調用目標資源.
FilterConfig
聲明: public interface FilterConfig
代表了Filter的配置,和Servlet一樣,Servlet也有一些配置信息,比如名字和初始化參數等.
它包含以下的方法.
.getFilterName(): 返回Filter的名字.
.getInitParameter(String name): 獲得名稱為name的初始化參數
.getServletContext(): 返回這個Filter所在Servlet上下文對象.
.getInitParameterNames(): 獲得Filter配置中的所有初始化參數的名字.
過濾器主要對客戶端的請求和客戶端的響應進行統一處理.最常見的web過濾器有權限認證過濾器,字符編碼過濾器,圖象處理過濾器等.
字符編碼過濾器(EncodingFillter.java)
package dorydoo.util;
import javax.servlet.FilterChain;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.FilterConfig;
/**
?*
?* @author?Dory Doo
?*/
public class EncodingFillter implements Filter
{
??? protected FilterConfig filterConfig;
??? private String targetEncoding="gb2312";
??? /**
???? *初始化過濾器像一般的Servlet一樣,它也可以獲得初始化參數
??? */
??? public void init(FilterConfig config)throws ServletException
??? {
??????? this.filterConfig=config;
??????? this.targetEncoding=config.getInitParameter("encoding");
??? }
??? /**
???? *進行過濾處理,最最要的地方就是這里了
??? */
??? public void doFilter(ServletRequest srequest,ServletResponse sresponse,FilterChain chain)
??? throws IOException,ServletException
??? {
??????? System.out.println("使用以下方法進行編碼:encoding="+targetEncoding);
???????
??????? HttpServletRequest request=(HttpServletRequest)srequest;
??????? request.setCharacterEncoding(targetEncoding);
??????? //把處理權發送到下一個
??????? chain.doFilter(srequest,sresponse);
??? }
???
??? public void setFilterConfig(final FilterConfig filterConfig)
??? {
??????? this.filterConfig=filterConfig;
??? }
??? //銷毀過濾器
??? public void destroy()
??? {
??????? this.filterConfig=null;
??? }
}
然后在web.xml中配置我們的應用.
?<web-app>
????? .................
??????? <!--Filter Config-->
?????? <filter>
??????????? <filter-name>cncoding</filter-name>
??????????? <filter-class>dorydoo.util.EncodingFilter</filter-class>
??????????? <init-param>
??????????????? <param-name>encoding</param-name>
??????????????? <param-value>gb2312</param-value>
??????????? </init-param>
??????? </filter>??
??????? <filter-mapping>
??????????? <filter-name>encoding</filter-name>
??????????? <servlet-name>action</servlet-name>
??????? </filter-mapping>?
??????? <filter-mapping>
??????????? <filter-name>encoding</filter-name>
??????????? <url-pattern>/*</url-pattern>
??????? </filter-mapping>
????? ........
?</web-app>
在來看一用戶認證的過濾器(SignonFilter)
package dorydoo.util;
import javax.servlet.FilterChain;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpSession;
/**
?*
?* @author DuYang
?*/
public class SignonFilter implements Filter
{
??? protected FilterConfig filterConfig;
??? String LOGIN_PAGE="login.jsp";
??? /**
???? *初始化過濾器像一般的Servlet一樣,它也可以獲得初始化參數
??? */
??? public void init(FilterConfig config)throws ServletException
??? {
??????? this.filterConfig=config;
??? }
??? /**
???? *進行過濾處理,最最要的地方就是這里了
??? */
??? public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)
??? throws IOException,ServletException
??? {????
??????? HttpServletRequest hreq=(HttpServletRequest)req;
??????? HttpServletResponse hres=(HttpServletResponse)res;
??????? HttpSession session=hreq.getSession();
??????? String isLogin="";
??????? try
??????? {
??????????? isLogin=(String)session.getAttribute("isLogin");
??????????? if(isLogin.equals("true"))
??????????? {
??????????????? System.out.println("在SignonFilter中驗證通過");
??????????????? //驗證通過繼續處理
??????????????? chain.doFilter(req,res);
??????????? }
??????????? else
??????????? {
??????????????? //驗證不成功重新登錄
??????????????? hres.sendRedirect(LOGIN_PAGE);
??????????????? System.out.println("被SignonFilter攔截一個為認證的請求");
??????????? }
??????? }
??????? catch(Exception e)
??????? {
??????????? e.printStackTrace();
??????? }
??? }
???
??? public void setFilterConfig(final FilterConfig filterConfig)
??? {
??????? this.filterConfig=filterConfig;
??? }
??? //銷毀過濾器
??? public void destroy()
??? {
??????? this.filterConfig=null;
??? }
}
在SignonFilter的doFilter()方法中,首先通過isLogin=(String)session.getAttribute("isLogin");判斷是否登錄用戶,如果不是則返回到login頁面.配置web.xml文件就和上面的基本上沒什么差別.