過濾

          Posted on 2006-06-29 11:23 多力宇揚 閱讀(298) 評論(0)  編輯  收藏 所屬分類: Controller

          在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文件就和上面的基本上沒什么差別.


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


          網站導航:
           
          主站蜘蛛池模板: 隆昌县| 仪征市| 香格里拉县| 保山市| 合川市| 宁城县| 武邑县| 赤壁市| 治多县| 句容市| 同江市| 长岛县| 土默特左旗| 洪洞县| 营山县| 东光县| 栖霞市| 鸡西市| 边坝县| 临澧县| 阿克| 阿图什市| 新干县| 贵南县| 灌南县| 资中县| 承德县| 铜陵市| 工布江达县| 桐乡市| 株洲县| 安西县| 张家口市| 巨野县| 靖安县| 潼南县| 安阳市| 周宁县| 寿阳县| 丰宁| 澄迈县|