首页>Program>source

我是servlet的新手,正在阅读一些有关过滤器和包装器的文字.我可以理解过滤器,但对包装感到困惑.在书中,作者举了一个例子:

如果没有包装:

public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {
        String name = request.getParameter("name").trim();
        try {
            chain.doFilter(request, response);
            PrintWriter out = response.getWriter();
            if (name.length() == 0) {
                out.println("Some message");
                out.println("</body>");
                out.println("</html>");
                out.close();
            }
        } catch (Throwable t) {
        }
    }

对于包装器:

public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {
        String name = request.getParameter("name").trim();
        HttpServletResponse httpRes = (HttpServletResponse) response;
        HttpServletResponseWrapper resWrapper = new HttpServletResponseWrapper(httpRes);
        try {
            chain.doFilter(request, response);
            PrintWriter out = resWrapper.getWriter(); // why dont we just use response.getWriter();
            if (name.length() == 0) {
                out.println("<h3>Some message");
                out.println("</body>");
                out.println("</html>");
                out.close();
            }
        } catch (Throwable t) {
        }
    }

为什么我们需要 HttpServletResponseWrapper 虽然我们可以用 ServletResponse做同样的事情 如果是情况1? 谁能给我一个明确的例子,我们必须使用 HttpServletResponseWrapper 代替 ServletResponse ? 我曾尝试过Google,但没有找到运气。

最新回答
  • 11天前
    1 #

    BalusC的回答很好,但如果您刚开始,可能会有些不知所措。

    简单地输入:SerlvetResponse及其扩展名HttpServletResponse是告诉您可以调用哪些方法来执行所需操作的接口.在正常使用Filters,Servlets等的过程中,您将经常使用HttpServletResponse来告诉您的应用程序如何响应请求。

    HttpServletResponsewrapper是HttpServletResponse的一种特定实现,它为您提供了一种方便的方法,可以用自己的某种逻辑包装现有响应,而不必编写接口的全新实现.它具有lot方法,因此这非常好.作为一个简单的示例,假设您想禁止对response.flushBuffer()的调用.这段代码使用HttpServletResponsewrapper可以做到:

    class DisallowFlushResponseWrapper extends HttpServletResponseWrapper {
        public DisallowFlushResponseWrapper(HttpServletResponse response) {
            super(response);
        }
        @Override
        public void flushBuffer() {
            throw new UnsupportedOperationException("Don't call this!");
        }
    }
    

    使用这种包装器的典型方法是创建一个像这样的过滤器:

    class DisallowFlushFilter implements Filter {
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) {
            if (response instanceof HttpServletResponse) {
                HttpServletResponse newResponse =
                    new DisallowFlushResponseWrapper((HttpServletResponse) response);
                chain.doFilter(request, newResponse);
            }
            ...
        }
        ...
    }
    

    请注意,我们使用自己的包装器实例包装进入过滤器的响应.然后,将包装纸递给过滤器链中的下一项.因此,此过滤器之后的所有内容如果调用flushBuffer()都会获得异常,因为它将在我们的包装器上调用它.包装器由于其默认行为,将把其他任何调用都委派给包装的响应,这是真正的响应,因此除对该方法的调用之外的所有内容都将正常工作。

  • 11天前
    2 #

    这确实是一个愚蠢的示例 这没有显示请求/响应包装的好处.实际上,整个过滤器示例很差. HTML的发出应由JSP或最高由servlet完成(但仍然很差).浏览我们的过滤器wiki页面,以获取有关过滤器用途的一些想法。

    如果您想修改响应的行为或只想收集有关响应的信息,那么响应包装器很有用 while 它被用于请求-响应链中.每当某个servlet或JSP在响应上调用某个方法时,就会发生修改的行为.如果在包装器类中覆盖了它,则将改为调用该类.您可以更改行为或在那里收集信息。

    在Stackoverflow上,您可以找到有用的 HttpServletResponseWrapper的一些具体示例 实施。

      How to insert JSF page rendering time and response size into the page itself, at least partially?

      MD5 Signing a HttpServletResponse

      How to configure Tomcat to not encode the session id into the URL when HttpServletResponse.encodeURL() is invoked

      How to add response headers based on Content-type; getting Content-type before the response is committed

      How is annotations support in jsp implemented in sitebricks?

      Capture and log the response body

      Log only http servlet response headers

      How to include a JSP page in a Facelets page?

      Capture generated dynamic content at server side

  • R 330在windows上安装软件包:找不到gcc错误
  • ios:目标C:从UIButton类的子类创建的按钮不起作用