课外天地 李树青学习天地JavaEE网站开发课件 → [推荐]第六部分课堂讲稿——Filter过滤器的使用


  共有15600人关注过本帖树形打印复制链接

主题:[推荐]第六部分课堂讲稿——Filter过滤器的使用

帅哥哟,离线,有人找我吗?
admin
  1楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 管理员
等级:管理员 帖子:1938 积分:26572 威望:0 精华:34 注册:2003/12/30 16:34:32
[推荐]第六部分课堂讲稿——Filter过滤器的使用  发帖心情 Post By:2010/11/12 21:50:34 [只看该作者]

1、一个Filter的简单使用方法
Servlet为:
package servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Exec extends HttpServlet {
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                        throws IOException, ServletException {
                doGet(request, response);
        }

        public void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws IOException, ServletException {
                response.setContentType("text/html");
                PrintWriter out = response.getWriter();
                out.println("<html><body>Get</body></html>");
                System.out.println("Executing Exec.doGet()");
        }
}


Filter为:
package web;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyFilter implements Filter {
        public void init(FilterConfig arg0) throws ServletException {
        }

        public void doFilter(ServletRequest request, ServletResponse response,
                        FilterChain chain) throws IOException, ServletException {
                System.out.println("Pre MyFilter.doFilter()");
                chain.doFilter(request, response);
                System.out.println("Post MyFilter.doFilter()");
        }

        public void destroy() {
        }

}


web.xml为:
        <filter>
                <filter-name>myFilter</filter-name>
                <filter-class>web.MyFilter</filter-class>
        </filter>
        <filter-mapping>
                <filter-name>myFilter</filter-name>
                <url-pattern>/Exec</url-pattern>
        </filter-mapping>

注意观察运行的输出,并尝试去除chain.doFilter(request, response)并观察效果

2、多个Filter的使用方法
增加Filter,为:
package web;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class YourFilter implements Filter {
        public void init(FilterConfig arg0) throws ServletException {
        }

        public void doFilter(ServletRequest request, ServletResponse response,
                        FilterChain chain) throws IOException, ServletException {
                System.out.println("Pre YourFilter.doFilter()");
                chain.doFilter(request, response);
                System.out.println("Post YourFilter.doFilter()");
        }

        public void destroy() {
        }

}

增加web.xml为:
        <filter>
                <filter-name>yourFilter</filter-name>
                <filter-class>web.YourFilter</filter-class>
        </filter>
        <filter-mapping>
                <filter-name>yourFilter</filter-name>
                <url-pattern>/Exec</url-pattern>
        </filter-mapping>

观察输出次序(嵌套)

3、多个Servlet和Filter的复杂调用
增加Servlet为:
package servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AnotherExec extends HttpServlet {
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                        throws IOException, ServletException {
                doGet(request, response);
        }

        public void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws IOException, ServletException {
                response.setContentType("text/html");
                PrintWriter out = response.getWriter();
                out.println("<html><body>AnotherExec.doGet</body></html>");
                System.out.println("Executing AnotherExec.doGet()");
        }
}

修改Exec,为:
package servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Exec extends HttpServlet {
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                        throws IOException, ServletException {
                doGet(request, response);
        }

        public void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws IOException, ServletException {
                response.setContentType("text/html");
                PrintWriter out = response.getWriter();
                out.println("<html><body>Exec.doGet</body></html>");
                System.out.println("Executing Exec.doGet()");
                try {
                        RequestDispatcher disp = request
                                        .getRequestDispatcher("/AnotherExec");
                        disp.forward(request, response);
                } catch (Exception e) {
                        System.out.println(e.getMessage());
                }
        }
}


增加web.xml为:
        <filter>
                <filter-name>myFilter</filter-name>
                <filter-class>web.MyFilter</filter-class>
        </filter>
        <filter>
                <filter-name>yourFilter</filter-name>
                <filter-class>web.YourFilter</filter-class>
        </filter>
        <filter-mapping>
                <filter-name>myFilter</filter-name>
                <url-pattern>/Exec</url-pattern>
        </filter-mapping>
        <filter-mapping>
                <filter-name>yourFilter</filter-name>
                <servlet-name>AnotherExec</servlet-name>
                <dispatcher>FORWARD</dispatcher>               
        </filter-mapping>

可以直接请求AnotherExec和Exec,分别查看输出
也可以删除<dispatcher>FORWARD</dispatcher>观察请求AnotherExec的效果

4、应用
4、1 查看执行时间
Filter为:
package web;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class MyFilter implements Filter {
        private FilterConfig config;
        private String logPrefix;

        public void init(FilterConfig config) throws ServletException {
                this.config = config;
                logPrefix = config.getInitParameter("Log Entry Prefix");
        }

        public void doFilter(ServletRequest request, ServletResponse response,
                        FilterChain chain) throws IOException, ServletException {
                long begin = System.currentTimeMillis();
                chain.doFilter(request, response);
                long end = System.currentTimeMillis();

                StringBuffer logMessage = new StringBuffer();
                if (request instanceof HttpServletRequest) {
                        logMessage = ((HttpServletRequest) request).getRequestURL();
                }
                logMessage.append(": ");
                logMessage.append(end - begin);
                logMessage.append(" ms");

                if (logPrefix != null) {
                        logMessage.insert(0, logPrefix);
                }
                System.out.println(logMessage.toString());
                config.getServletContext().log(logMessage.toString());
                //localhost_log.XXXX-XX-XX.txt
        }

        public void destroy() {
                config = null;
                logPrefix = null;
        }

}

增加web.xml为:
        <filter>
                <filter-name>myFilter</filter-name>
                <filter-class>web.MyFilter</filter-class>
                <init-param>
                        <param-name>Log Entry Prefix</param-name>
                        <param-value>Performance: </param-value>
                </init-param>
        </filter>
        <filter-mapping>
                <filter-name>myFilter</filter-name>
                <url-pattern>/Exec</url-pattern>
        </filter-mapping>


4、2 Error处理
Filter为:
package web;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyFilter implements Filter {
        public void init(FilterConfig arg0) throws ServletException {
        }

        public void doFilter(ServletRequest request, ServletResponse response,
                        FilterChain chain) throws IOException, ServletException {
                System.out.println("Pre MyFilter.doFilter()");
                chain.doFilter(request, response);
                System.out.println("Post MyFilter.doFilter()");
        }

        public void destroy() {
        }

}

修改web.xml为:
        <filter>
                <filter-name>myFilter</filter-name>
                <filter-class>web.MyFilter</filter-class>
        </filter>
        <filter-mapping>
                <filter-name>myFilter</filter-name>
                <url-pattern>/error.jsp</url-pattern>
                <dispatcher>ERROR</dispatcher>
        </filter-mapping>
        <error-page>
                <error-code>404</error-code>
                <location>/error.jsp</location>
        </error-page>

此时请求不存在资源时会发生过滤,但是如果请求存在资源,如果页面中有response.sendError(404,"出错了!"),那么该错误页面仍然会被调用,过滤器也会工作
如修改index.jsp文件为:
<%@ page c%>

<html>
<head>
</head>

<body>
<%
        response.sendError(404, "Error");
%>
</body>
</html>

此时不会postfilter,只有prefilter

 

 


 


 回到顶部