如何更改过滤器中 http 响应的正文

2024-04-07

我正在尝试使用过滤器来检查响应正文中的 HTML 标记。问题是,如果我改变过滤器中的主体,当它到达客户端时它不会改变。我尝试了此处显示的解决方案:寻找使用 servlet 过滤器将内容插入响应的示例 https://stackoverflow.com/questions/14736328/looking-for-an-example-for-inserting-content-into-the-response-using-a-servlet-f但这没有帮助。

我有两个过滤器。SecureWrapperFilter将请求/响应对象包装在我们的自定义包装器中,并且XSSFilter使用 OWASP 编码对 html 内容进行编码。过滤器看起来像这样:

public class SecureWrapperFilter implements Filter {

    @Override
    public void init(final FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response,
        final FilterChain chain) throws IOException, ServletException
    {
        final ServletRequestWrapper securityRequest =
            new ServletRequestWrapper((HttpServletRequest)request);
        final ServletResponseWrapper securityResponse =
            new ServletResponseWrapper((HttpServletResponse)response);
        ESAPI.httpUtilities().setCurrentHTTP(securityRequest, securityResponse);
        chain.doFilter(ESAPI.currentRequest(), ESAPI.currentResponse());
    }

    @Override
    public void destroy() {
    }
}

and:

public class XSSFilter implements Filter {

    @Override
    public void init(final FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response,
        final FilterChain chain) throws IOException, ServletException
    {      
        final ServletRequestWrapper requestWrapper = (ServletRequestWrapper)request;
        final String body = Encode.forHtmlContent(requestWrapper.getBody());
        requestWrapper.setBody(body);
        chain.doFilter(requestWrapper, response);
        final ServletResponseWrapper responseWrapper = (ServletResponseWrapper)response;
        final byte[] copy = responseWrapper.getCopy();
        final String oldBody = new String(copy, response.getCharacterEncoding());
        final String newBody = Encode.forHtmlContent(oldBody);
        if (!StringUtils.equals(oldBody, newBody)) {
            responseWrapper.getResponse().getOutputStream().write(newBody.getBytes());
        }
    }

    @Override
    public void destroy() {
    }
}

如果我添加一些调试日志记录,我可以看到securityResponseSecureWrapperFilter 中有修改后的主体,但在客户端,主体看起来好像从未被修改过。

任何建议将不胜感激。谢谢。


问题是在我的 XSSFilter 中,我将新的响应正文附加到旧的响应正文上。这会导致无效的 json,例如{"x"="y"}{"escapedx"="escapedy")

我们的客户端反序列化器只打印第一个 json 对象,所以{"x"=y"}这就是我们在客户端看到的一切。

为了解决此问题,我将以下行添加到 XSSFilter:

responseWrapper.getResponse().resetBuffer();

before

responseWrapper.getResponse().getOutputStream().write(newBody.getBytes());

这会清除缓冲区,让我可以在下面的行重写它。我在客户端的 json 现在看起来像:{"escapedx"="escapedy"}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何更改过滤器中 http 响应的正文 的相关文章

  • JPA 中的复合键

    我想创建一个具有自动生成的主键的实体 而且还有一个由其他两个字段组成的唯一复合键 我如何在 JPA 中执行此操作 我想这样做是因为主键应该用作另一个表中的外键 并且使其复合并不好 在下面的代码片段中 我需要命令和模型是唯一的 pk当然是主键
  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • “java.net.MalformedURLException:未找到协议”读取到 html 文件

    我收到一个错误 java net MalformedURLException Protocol not found 我想读取网络上的 HTML 文件 mainfest uses permission android name android
  • 是否有任何简单(且最新)的 Java 框架可用于在 Swing 应用程序中嵌入电影?

    我正在构建一个小型 Swing 应用程序 我想在其中嵌入一部电影 重要的是 这个应用程序是一个 WebStart 应用程序 并且该库应该能够打包在我启动的 jnlp 中 即 不依赖于本机库 我知道并尝试过 JMF 但我认为与其他框架相比 其
  • 通往楼梯顶部的可能路径

    这是一个非常经典的问题 我听说谷歌在他们的面试中使用过这个问题 问题 制定一个递归方法 打印从楼梯底部到楼梯顶部的所有可能的独特路径 有 n 个楼梯 您一次只能走 1 步或 2 步 示例输出 如果它是一个有 3 级楼梯的楼梯 1 1 1 2
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 如何避免 ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException? [复制]

    这个问题在这里已经有答案了 如果你的问题是我得到了java lang ArrayIndexOutOfBoundsException在我的代码中 我不明白为什么会发生这种情况 这意味着什么以及如何避免它 这应该是最全面的典范 https me
  • Java:如何为山区时间创建 TimeZone 对象?

    必须不禁用夏令时 嗯 在这个清单 http en wikipedia org wiki List of tz database time zones在 zoneinfo 时区名称中 有很多声称是 山地时间 找到最适合您想要的那个 然后使用它
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • Docker 和 Eureka 与 Spring Boot 无法注册客户端

    我有一个使用 Spring Boot Docker Compose Eureka 的非常简单的演示 我的服务器在端口 8671 上运行 具有以下应用程序属性 server port 8761 eureka instance prefer i
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • 最适合“正在进行的作业”的 HTTP 状态代码

    向客户端提供的最合适的 HTTP 状态代码是什么 表示 您的请求很好 但仍在进行中 请稍后在完全相同的位置回来查看 例如 假设客户端提交初始请求以启动繁重的查询 服务器立即返回一个 URL 客户端可以定期轮询该 URL 以获取结果 如果客户
  • 如何在Android中解析xml类型的HTTPResponse

    我有一个 Android 应用程序 我使用 POST 方法来获取响应 这是我的代码 HttpResponse httpResponse httpclient execute httppost HttpEntity resEntity htt
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就

随机推荐

  • RequireJS 中的命名模块与未命名模块

    我们可以通过给它命名来在 requireJS 中创建一个模块 define name dep function dep module definition 或者我们可以创建一个不包含名称的 define dep function dep m
  • 隐藏水平滚动条(Angular ui-grid)

    我试图隐藏 Angular ui grid 的水平滚动条 但我找不到正确的属性 财产启用滚动条 假删除两者 是否可以只删除水平滚动条 使用 Github v3 0 0 rc 16 上的最新版本 您可以分别禁用水平和垂直滚动条 代替 enab
  • 为什么 Java 8 泛型类型推断选择这种重载?

    考虑以下程序 public class GenericTypeInference public static void main String args print new SillyGenericWrapper get private s
  • 使用水豚测试黄瓜中的饼干

    作为网站集成测试的一部分 我将黄瓜与水豚一起使用 水豚似乎无法模拟cookie的使用 例如 我在用户登录时设置 cookie def sign in user cookies permanent signed remember token
  • iOS UiWebView“帧加载中断”

    我有一个 UiWebView 指向一个外部站点 该站点的会话过期时间为 30 分钟不活动 在我的应用程序中 我在应用程序中嵌入了一个自定义登录页面 因为我无法使用远程站点的登录页面 这个登录页面是 file index html 当用户将应
  • 包(Python PIL/Pillow)已安装,但我无法导入它

    我想做一些图像处理 但遇到了问题 导入枕头模块似乎不起作用 我在这里找到了一个简单的脚本来检查安装了哪些软件包 我找到了它 但导入它似乎不起作用 这是我尝试运行的代码 import pip installed packages pip ge
  • SignalR cookie 未从客户端发送

    我有一个从客户端发送的 cookie 用作我的 MVC Web 服务的一部分 但是现在我已将集线器集成到此应用程序中 集线器不会发送 cookie 而 mvc 应用程序会发送该 cookie 现在 在阅读其他类似的问题 不是很多 后 coo
  • Little Endian 并推入 nasm

    我不明白为什么代码的输出是Ole 小字节序不应该影响push命令 global start section data x dd 3 section text start mov eax 4 mov ebx 1 mov dword x 0x0
  • C++: std::tie 与 std::ignore 的返回类型

    我想知道 C 11 标准是否给出了关于type of the std tuple由返回std tie当一些论点是std ignore 更具体地说 我可以假设 decltype std tie 42 std ignore 不等于decltyp
  • 64 位 Microsoft SQL Server 数据工具

    我无法找到 64 位版本的 Microsoft SQL Server Data Tools 有谁知道哪里可以下载64位版本Microsoft SQL Server 数据工具 Visual Studio 2013 和 SQL Server 2
  • 在 Swift 中检查 iOS 设备是否有 LiDAR

    Swift 有没有办法检查设备是否有 LiDAR 传感器 不幸的是 我在苹果官方纪录片和互联网搜索中都没有找到任何信息 我当前的解决方法是确定设备类型 如本文中所述 如何确定当前的iPhone 设备型号 https stackoverflo
  • Sencha Touch 2 - 无法从控制器获取参考视图

    我正在尝试通过参考查看 在控制器中定义的方法内 我收到错误消息 对象 object Object 没有方法 getUserForm 这是我的视图和控制器 如果有人可以帮助我 我会很高兴 提前致谢 用户表格 Ext define appNam
  • .htaccess url重写

    我想重写一个URL 假设您访问http files domain com uploads file name jpg http files domain com uploads file name jpg 我如何使用 htaccess 来编
  • Python - 导入函数和本地声明函数之间的性能差异?

    在 Python 中导入函数与在当前文件中声明函数在性能上是否存在显着差异 我有一个小函数 单行 我经常在几个函数中使用它 py我的程序中的文件 我希望只定义一次 以便我对它所做的更改反映在各处 但是 我不确定将它用作导入函数是否会在调用它
  • 使 (Mac)Vim 重新打开并在关闭时打开文件

    使用案例 MacVim 窗口中显示 2 3 个文件 您按 ctrl Q MacVim 就会关闭 当您重新启动 MacVim 时 它会打开并显示与您关闭它时相同的文件 你怎么能这么做呢 ANSWER 我将以下内容添加到我的 vmirc sav
  • 组合 Spark UDF(而不是将 UDF 作为一个)时是否会造成性能损失?

    我想知道编写 Spark udf 是否会降低性能 一般来说 我更喜欢编写只做一件事的小函数 这是一个简单的例子 给定一个DataFrame df def inc udf i Double gt i 1 def double udf i Do
  • Gson:java.text.ParseException:无法解析的日期:“2018-04-09T09:00:00 + 02:00”

    如何解析以下格式的字符串日期 2018 04 09T09 00 00 02 00 Gson使用 new SimpleDateFormat yyyy MM dd T HH mm ss Z Locale US 但它给出了以下例外 com goo
  • Python:为什么要腌制?

    我一直在使用pickle并且很高兴 然后我看到了这篇文章 不要腌制你的数据 http www benfrederickson com 2014 02 12 dont pickle your data html 进一步阅读似乎是 泡菜很慢 h
  • 如何中止存储桶的所有不完整分段上传

    有时 分段上传会因某种原因挂起或无法完成 在这种情况下 您将陷入难以删除的孤立部分 您可以通过以下方式列出它们 aws s3api list multipart uploads bucket BUCKETNAME 我正在寻找方法来中止它们
  • 如何更改过滤器中 http 响应的正文

    我正在尝试使用过滤器来检查响应正文中的 HTML 标记 问题是 如果我改变过滤器中的主体 当它到达客户端时它不会改变 我尝试了此处显示的解决方案 寻找使用 servlet 过滤器将内容插入响应的示例 https stackoverflow