Servlet过滤器

来源:互联网 发布:淘宝咸鱼官方下载 编辑:程序博客网 时间:2024/04/30 22:33

Servlet过滤器与自来水杯过滤的原理相似,它主要用于读客户端(浏览器)的请求进行过滤处理,再讲过滤后的请求转交给下一个资源。对于程序开发人员而言,过滤器实质就是在Web服务器上的一个Web应用组件,用于拦截客户端(浏览器)对目标资源的请求,并对这些请求进行一定的过滤处理再发送给目标资源。

如图 过滤器的处理方式



在Web容器中部署了过滤器以后,不仅客户端发送的请求会经过过滤器的处理,而且请求在发送到目标资源处理以后,请求的回应信息也同样要经过过滤器。

@WebFilter(filterName = "TestFilter", urlPatterns = {"/test"})public class TestFilter implements Filter {        private static final boolean debug = true;    // The filter configuration object we are associated with.  If    // this value is null, this filter instance is not currently    // configured.     private FilterConfig filterConfig = null;        public TestFilter() {    }            private void doBeforeProcessing(ServletRequest request, ServletResponse response)            throws IOException, ServletException {        if (debug) {            log("TestFilter:DoBeforeProcessing");        }        // Write code here to process the request and/or response before        // the rest of the filter chain is invoked.        // For example, a logging filter might log items on the request object,        // such as the parameters./*         for (Enumeration en = request.getParameterNames(); en.hasMoreElements(); ) {         String name = (String)en.nextElement();         String values[] = request.getParameterValues(name);         int n = values.length;         StringBuffer buf = new StringBuffer();         buf.append(name);         buf.append("=");         for(int i=0; i < n; i++) {         buf.append(values[i]);         if (i < n-1)         buf.append(",");         }         log(buf.toString());         }         */    }            private void doAfterProcessing(ServletRequest request, ServletResponse response)            throws IOException, ServletException {        if (debug) {            log("TestFilter:DoAfterProcessing");        }        // Write code here to process the request and/or response after        // the rest of the filter chain is invoked.        // For example, a logging filter might log the attributes on the        // request object after the request has been processed. /*         for (Enumeration en = request.getAttributeNames(); en.hasMoreElements(); ) {         String name = (String)en.nextElement();         Object value = request.getAttribute(name);         log("attribute: " + name + "=" + value.toString());         }         */        // For example, a filter might append something to the response./*         PrintWriter respOut = new PrintWriter(response.getWriter());         respOut.println("<P><B>This has been appended by an intrusive filter.</B>");         */    }    /**     *     * @param request The servlet request we are processing     * @param response The servlet response we are creating     * @param chain The filter chain we are processing     *     * @exception IOException if an input/output error occurs     * @exception ServletException if a servlet error occurs     */    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain)            throws IOException, ServletException {                if (debug) {            log("TestFilter:doFilter()");        }                doBeforeProcessing(request, response);                Throwable problem = null;        try {            chain.doFilter(request, response);        } catch (Throwable t) {            // If an exception is thrown somewhere down the filter chain,            // we still want to execute our after processing, and then            // rethrow the problem after that.            problem = t;            t.printStackTrace();        }                doAfterProcessing(request, response);        // If there was a problem, we want to rethrow it if it is        // a known type, otherwise log it.        if (problem != null) {            if (problem instanceof ServletException) {                throw (ServletException) problem;            }            if (problem instanceof IOException) {                throw (IOException) problem;            }            sendProcessingError(problem, response);        }    }    /**     * Return the filter configuration object for this filter.     */    public FilterConfig getFilterConfig() {        return (this.filterConfig);    }    /**     * Set the filter configuration object for this filter.     *     * @param filterConfig The filter configuration object     */    public void setFilterConfig(FilterConfig filterConfig) {        this.filterConfig = filterConfig;    }    /**     * Destroy method for this filter     */    public void destroy() {            }    /**     * Init method for this filter     */    public void init(FilterConfig filterConfig) {                this.filterConfig = filterConfig;        if (filterConfig != null) {            if (debug) {                                log("TestFilter:Initializing filter");            }        }    }    /**     * Return a String representation of this object.     */    @Override    public String toString() {        if (filterConfig == null) {            return ("TestFilter()");        }        StringBuffer sb = new StringBuffer("TestFilter(");        sb.append(filterConfig);        sb.append(")");        return (sb.toString());    }        private void sendProcessingError(Throwable t, ServletResponse response) {        String stackTrace = getStackTrace(t);                        if (stackTrace != null && !stackTrace.equals("")) {            try {                response.setContentType("text/html");                PrintStream ps = new PrintStream(response.getOutputStream());                PrintWriter pw = new PrintWriter(ps);                                pw.print("<html>\n<head>\n<title>Error</title>\n</head>\n<body>\n"); //NOI18N                // PENDING! Localize this for next official release                pw.print("<h1>The resource did not process correctly</h1>\n<pre>\n");                                pw.print(stackTrace);                                pw.print("</pre></body>\n</html>"); //NOI18N                pw.close();                ps.close();                response.getOutputStream().close();            } catch (Exception ex) {            }        } else {            try {                PrintStream ps = new PrintStream(response.getOutputStream());                t.printStackTrace(ps);                ps.close();                response.getOutputStream().close();            } catch (Exception ex) {            }        }    }        public static String getStackTrace(Throwable t) {        String stackTrace = null;        try {            StringWriter sw = new StringWriter();            PrintWriter pw = new PrintWriter(sw);            t.printStackTrace(pw);            pw.close();            sw.close();            stackTrace = sw.getBuffer().toString();        } catch (Exception ex) {        }        return stackTrace;    }        public void log(String msg) {        filterConfig.getServletContext().log(msg);            }}



0 0
原创粉丝点击