無為

          無為則可為,無為則至深!

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks

          同servlet非常類似,F(xiàn)ilter就是JAVA組件,請求發(fā)送到servlet前,可以使用過濾器Filter截獲和處理請求,同時(shí)servlet結(jié)束以后,響應(yīng)發(fā)回以前同樣可以使用過濾器Filter處理響應(yīng)。WEB容器可以用web.xml部署文件聲明何時(shí)調(diào)用過濾器Filter。

          過濾器Filter主要功能是:1、完成安全檢查;2、重新格式化請求首部或體;3、建立請求審計(jì)或記錄日志---請求過濾器Filter

          1、壓縮響應(yīng)流;2、追加或者修改響應(yīng)流;3、創(chuàng)建一個(gè)定制響應(yīng)---響應(yīng)過濾器Filter


          同servlet一樣,過濾器Filter也具有生命周期:init()->doFilter()->destroy().要實(shí)現(xiàn)模塊化,F(xiàn)ilterChain功不可末,它可以采用不同的方式組合過濾器,協(xié)調(diào)完成一些事情,它由部署文件中的filter元素驅(qū)動(dòng),和Filter都在javax.servlet包中。在servlet2.4中,過濾器同樣可以用于請求分派器,但須在web.xml中聲明,<dispatcher>INCLUDE或FORWARD或REQUEST或ERROR</dispatcher>該元素位于filter-mapping中。


          1、實(shí)現(xiàn)一個(gè)Filter,代碼如下:

          public class MyFilter implements Filter {

          public void init(FilterConfig arg0) throws ServletException {

          }

          public void doFilter(ServletRequest request, ServletResponse response,
          FilterChain chain) throws IOException, ServletException{


          HttpServletRequest httpRequest = (HttpServletRequest) request;
          HttpServletResponse httpResponse = (HttpServletResponse)response;
          CachedResponseWrapper wrapper = new CachedResponseWrapper(httpResponse);
          // 寫入wrapper:
          chain.doFilter(request, wrapper);
          // 首先判斷status, 只對200狀態(tài)處理:
          if(wrapper.getStatus()==HttpServletResponse.SC_OK) {
          // 對響應(yīng)進(jìn)行處理,這里是進(jìn)行GZip壓縮:
          byte[] data = GZipUtil.gzip(wrapper.getResponseData());
          httpResponse.setContentType(getContentType());
          httpResponse.setContentLength(data.length);
          httpResponse.setHeader("Content-Encoding", "gzip");

          ServletOutputStream output = response.getOutputStream();
          output.write(data);
          output.flush();
          }
          }

          public void destroy() {

          }

          }


          2、實(shí)現(xiàn)一個(gè)HttpServletResponseWrapper

          public class CheckFrameHttpServletResponseWrapper extends
          HttpServletResponseWrapper {

          public CheckFrameHttpServletResponseWrapper(HttpServletResponse response) {

          super(response);
          }

          public PrintWriter getWriter() throws IOException{
          return new CheckFrameWriter(super.getWriter());
          }

          }

          3、實(shí)現(xiàn)一個(gè)Writer

          public class CheckFrameWriter extends PrintWriter {
          String checkString = "<script>\n if(window.top.frames.length==0){\n"
          + "window.location.href=\"https://aix:9080/sso/mainlayout.faces?"
          + "contentURL=http://aix:9080/security/paramsMaintain/"
          + "addParams.faces?roleId=0001\"\n" + "}\n</script>\n";

          public CheckFrameWriter(Writer out) {
          super(out);
          }

          public void write(int c) {
          super.write((char) c);
          }

          public void write(char buf[], int off, int len) {
          StringBuffer sb = new StringBuffer(len);
          for (int i = 0; i < len; i++) {
          sb.append(buf[off + i]);
          }
          String s = sb.toString();
          int bodyIndex = s.indexOf("<body>");
          if (bodyIndex > -1) {
          String part1 = s.substring(0, bodyIndex);
          String part2 = s.substring(bodyIndex );
          s = part1 + checkString + part2;
          }
          for (int i = 0; i < s.length(); i++) {
          write(s.charAt(i));
          }
          }

          public void write(String s, int off, int len) {
          for (int i = 0; i < len; i++) {
          write(s.charAt(off + i));
          }
          }
          }


          在Writer中,你便可以隨心所欲的修改Response的內(nèi)容了。

          4、在Web.xml中加入相應(yīng)的配置元素,對JSP進(jìn)行攔截。



          凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
          、轉(zhuǎn)載請注明來處和原文作者。非常感謝。

          posted on 2007-07-25 13:56 草兒 閱讀(7262) 評論(3)  編輯  收藏 所屬分類: Web Data Mining 、JAVA WEB應(yīng)用

          Feedback

          # re: JAVA組件過濾器Filter[未登錄] 2007-07-25 16:33 劉明
          正好問問。

          我做了一個(gè)過濾器,我想過濾某一組資源里的某幾個(gè)資源該怎么做呢?配置多個(gè)servlet-mapping不可行啊。

          <filter>
          <filter-name>AuditFilter</filter-name>
          <filter-class>com.wrox.projsp.ch14.filters.AuditFilter
          </filter-class>
          </filter>
          <filter-mapping>
          <filter-name>AuditFilter</filter-name>
          <url-pattern>/*</url-pattern>
          </filter-mapping>

          以上的配置是對所有資源的過濾,如果我只想過濾里面的幾個(gè)資源呢?比如過濾一個(gè)html、2個(gè)jsp什么的,怎么做呢?謝謝。  回復(fù)  更多評論
            

          # re: JAVA組件過濾器Filter 2007-07-26 00:34 草兒
          我個(gè)人的解決方案是:1、采用目錄分割<url-pattern>/html/*</url-pattern>
          <url-pattern>/jsp/*</url-pattern>
          自然會(huì)根據(jù)url模式匹配過濾器;
          2、在web.xml部署多個(gè)filter元素,然后在實(shí)現(xiàn)Filter接口定制過濾器類中有doFilter()方法調(diào)用;  回復(fù)  更多評論
            

          # re: JAVA組件過濾器Filter[未登錄] 2007-07-26 09:34 劉明
          謝謝草兒。

          嗯。。。是個(gè)問題,感覺控制力還是不夠啊??磥響?yīng)用的時(shí)候還是有個(gè)好的設(shè)計(jì)才行。  回復(fù)  更多評論
            

          主站蜘蛛池模板: 治多县| 积石山| 宝兴县| 水城县| 临夏市| 无棣县| 南开区| 酒泉市| 稻城县| 蓬莱市| 德惠市| 巴中市| 镇坪县| 宽城| 准格尔旗| 安阳县| 新郑市| 上饶县| 石城县| 峨边| 九寨沟县| 新宾| 湟中县| 仪陇县| 丰镇市| 新巴尔虎右旗| 洪雅县| 呼伦贝尔市| 周至县| 梨树县| 双桥区| 格尔木市| 长武县| 郓城县| 基隆市| 淮南市| 德兴市| 浦县| 武功县| 平塘县| 平罗县|