【问题标题】:Java HttpServletResponse with blank-value headers?带有空值标​​头的Java HttpServletResponse?
【发布时间】:2011-06-24 15:02:54
【问题描述】:

如何使用空值响应标头进行基于 java 的应用程序服务器回复,像这样?

content-length:\r\n

不幸的是,当我打电话时

response.setHeader("Content-Length", len)

如果 len 是空字符串或 null,则响应将不包含标头。

我检查了 HttpServletResponse 和 HttpServletResponseWrapper javadocs,但不知道可以覆盖什么来提供我的自定义行为。

背景

我正在构建一个测试应用程序,它应该模拟行为不佳的 HTTP 服务器场景。该应用程序应该回复带有预设页面和 HTTP 标头的请求,包括上述情况的格式错误的请求。 该应用程序是用 grails 编写的。

【问题讨论】:

    标签: java grails http-headers httpserver servlets


    【解决方案1】:

    我正在构建一个测试应用程序,它应该模拟行为不佳的 HTTP 服务器场景。

    在这种情况下,试图让表现良好的服务器模仿这种行为是一个坏主意。如果您需要模拟一个坏的服务器,或者您希望测试的一组特定场景,那么您可以执行以下操作之一:

    • 编写一个自定义应用程序,该应用程序侦听特定端口(使用 ServerSocket 类),该端口将使用格式错误的 HTTP 标头进行响应。使用 HTTP 库可能无济于事,因为库可能有代码来检测错误条件并自动纠正它们。
    • 使用能够拦截响应并允许修改这些响应的 HTTP 代理。如果您在 Google 上搜索“http 调试代理”,您会找到几个,但如果您还没有听说过,我建议您查看 FiddlerWebScarabBurp

    【讨论】:

    • 我想我会编写一个自定义服务器,使用 netty 或原始套接字实现。试图拼凑出一个适用于任何 servlet 容器的 HTTP 实现的解决方案被证明是毫无意义的。
    【解决方案2】:

    您可以尝试使用 SoapUIFiddler 之类的工具及其 Firefox 扩展程序。我没有尝试与他们一起设置格式错误的标题,但如果可以的话,我不会感到惊讶。

    【讨论】:

    • 我已经检查了 SoapUI,现在检查了 Fiddler,虽然它们看起来是非常有趣的工具,但它们不适合我试图涵盖的用例:P
    • 啊,那么也许您应该详细说明您的用例。 “不良行为模拟”是否必须内置到您的应用程序中?如果是这样,那么您可以覆盖 HttpServletResponse 对象以删除其 RFC 2047 验证。如果您决定采用该路线,您还需要实现自定义过滤器以处理传入的 servlet 请求。
    • 这个想法是,应用程序提供了一个从数据库创建、读取、更新和删除的接口,以及一个响应用户输入的任何内容+标题的服务,无论是否符合 RFC。到目前为止,所有覆盖 HttpServletResponse 行为的尝试都没有结果。
    【解决方案3】:

    我不清楚:您的应用程序是用 Grails 编写的,但您正在讨论 javadocs...好吧,我想您尝试用 JAVA 创建一个糟糕的服务器...

    如您所说,使用“Content-Length:\r\n”回答对于 HTTP 是不合法的。您必须输入一个整数值或丢弃标头。我认为 setHeader() 可以帮助您避免产生非法的 HTTP 消息。

    您可以通过这种方式手动创建标头(您可以直接写入套接字而不使用 setHeader 块)。

    其他解决方案是使用您自己的 HttpServletResponse 实现创建一个过滤器(除了您的 servlet)。您将把这个实现传递给 servlet。

    【讨论】:

    • 我正在尝试过滤路线
    • 我正在尝试使用过滤器路由,将我的自定义 HttpServletResponseWrapper 子类注入流中。我的实现将 http 标头(有效或无效)保存在与超类不同的字段中。我已经覆盖了 addHeader 和 setHeader 以添加到该字段中。但是,我无法确定要为 servlet 容器覆盖哪些方法以从该对象中提取我的自定义标头。 HttpServletResponse 似乎只为标头提供 setter,但没有 getter...
    猜你喜欢
    • 1970-01-01
    • 2018-06-12
    • 2020-08-01
    • 2017-10-13
    • 2014-10-19
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 2016-08-23
    相关资源
    最近更新 更多