当前位置: 首页 > 知识库问答 >
问题:

为什么在servlet中准备好输出后,ServletSolutions对象不通过过滤器

冯枫
2023-03-14

在Head First JSP和Servlets中,我阅读了过滤器一章,因为我看到当使用过滤器时,servlet中准备的最终输出(ServletResponse)不会通过过滤器,而是直接发送给客户机(最终用户)。为什么。在这个例子中,它表示响应没有通过过滤器,而是直接发送到客户端,为此,我们必须使用诸如HttpServletResponseWrapper之类的包装器。

>

  • 当过滤器启用时,我们可以拦截请求,但是为什么响应没有被拦截。

    为什么对于响应,我们创建了一个扩展HttpServletResponseWrapper的定制响应。

    能解释一下吗

  • 共有1个答案

    越骏俊
    2023-03-14

    你弄得很混乱。过滤器可以截取、更改或替换请求和响应,并且可以在servlet处理之前或之后操作。问题是,如果您将原始响应向下传递,从chain.doFilter返回时,它可能已经提交,换句话说,它可能已经发送到客户端,并且已经太迟了它!

    让我们看看过滤器是如何工作的。相关方法doFilter

    void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        // BEFORE calling chain.doFilter, the filter can
        // modify request, wrap request and pass it to the chain, wrap the response and
        // pass a dummy response to the chain, or directly commit the response and return
        // without even calling the chain
    
        chain.doFilter(req, resp); // eventually pass the original or wrapped requests 
            // and responses down the chain to the Servlet (in no other Filter decides
            // to directly commit the response)
    
        // AFTER calling the chain, the response should have allready been committed (sent to client ...)
        // and so can no longer be changed ... unless a wrapped "dummy" response was
        // passed to the chain - in that case it is time to process the original response
    }
    
     类似资料:
    • 问题内容: 我正在学习如何使用该功能。 这是我编写的代码: 如您所见,我正在尝试删除所有不包含键的字典。 该代码正常工作,实际上如果我这样做: 我得到: 问题是,如果我做两次: 第二次,我得到一个空清单。 你能解释一下为什么吗? 问题答案: 这是经典的python3 doh!。 过滤器是可以迭代的特殊可迭代对象。但是,就像生成器一样,您只能对其迭代一次。因此,通过调用,您可以遍历对象的每个元素以生

    • 我试图通过映射[objectid: String,Int]过滤包含对象的Seq[Object],其中Object.id是映射中的一个键。 我想返回一个新的Map,其中只包含id在原始映射中的对象及其Int值。因此函数应该返回Map[Object,Int] 这是我到目前为止的情况?实现这一目标的最佳方法是什么?

    • 问题内容: 前言 这是我第一次尝试过滤器,要小心。 项目介绍 我正在尝试为我们的一些应用程序最终确定SSO的构建,而且似乎步履维艰。我尝试连接的Webapp使用“身份验证”标头来确定应用程序内的用户凭据。我构建了一个Filter,希望在将标头传递到Web应用程序之前对其进行设置。 问题 该代码通过Eclipse验证,编译,加载到Tomcat,然后传递到Webapp。唯一缺少的是Authentica

    • 问题内容: 文档中没有示例,我只是想知道从输入中得到什么。 问题答案: 在Elasticsearch 0.16(Lucene 3.1)之前,标准令牌过滤器是“标准化由标准令牌生成器提取的令牌”。具体来说,它是删除首字母缩写词和句点的末尾。因此,通过标准过滤器后, 将成为 过去。从Elasticsearch 0.16(Lucene 3.1)开始,标准令牌过滤器不执行任何操作(至少在当前情况下)。它只

    • 我有一个名为的对象,它描述了一个项目的买卖行为。与其他一些属性相比,它主要如下所示: 具有各自的吸气器和设置器。是该项目应出售/购买的金额,ItemData描述该项目的规格。PriceType是一个枚举,它是或。 我现在有一个方法,是哪个工作,在一个列表中找到最匹配的价格。我的所有价格都存储在一个简单称为的列表中。到目前为止,我的方法只是遍历列表,并返回与和匹配的第一个: 然而,这完全忽视了一个事

    • 问题内容: 在bash中,是否可以通过STDOUT将STDERR通过过滤器传递给管道?那就是我想要 而不是 问题答案: 这是一个示例,以如何在bash中交换文件描述符为模型。以下是a.out的输出,不带’STDXXX:’前缀。 从以上链接引用: 首先将标准输出另存为&3(&1分为3) 接下来将stdout发送到stderr(&2被复制为1) 将stderr发送到&3(stdout)(&3被分成2个