Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Jackson生成器对html值进行转义_Java_Json_Spring_Spring Mvc_Jackson - Fatal编程技术网

Java 如何使用Jackson生成器对html值进行转义

Java 如何使用Jackson生成器对html值进行转义,java,json,spring,spring-mvc,jackson,Java,Json,Spring,Spring Mvc,Jackson,我们使用Spring及其内置的MappingJacksonHttpMessageConverter生成许多JSON对象。太好了 但是现在我想html转义我的(任何类型的)对象的字符串值,以防止XSS 那么,我该如何处理这个问题呢?我首先想到可以编写一个自定义对象映射器,并将其放入MappkingJacksonHttpMessageConverter。但是,writeValue接受一个对象,我不希望这样,我希望它的字段可以迭代。我打赌jackson转换器也需要这样做,而不是自己做。所以我想影响这一

我们使用Spring及其内置的MappingJacksonHttpMessageConverter生成许多JSON对象。太好了

但是现在我想html转义我的(任何类型的)对象的字符串值,以防止XSS

那么,我该如何处理这个问题呢?我首先想到可以编写一个自定义对象映射器,并将其放入MappkingJacksonHttpMessageConverter。但是,writeValue接受一个对象,我不希望这样,我希望它的字段可以迭代。我打赌jackson转换器也需要这样做,而不是自己做。所以我想影响这一部分

现在我得到了一个SerializerProvider接口。ObjectMapper正在调用标准实现(StdSerializerProvider)。因此,我想覆盖/影响负责设置值的方法

可能吗?据我所知,很难扩展。我无法重写StdSerializerProvider以重写ObjectMapper使用的方法。也许我需要重写另一个

或者,也许这是完全错误的,我需要从一个完全不同的角度来看待它

有什么想法吗

哦,顺便说一句,我自己实现SerializerProvider并创建一个委托给StdSerializerProvider的composit是可能的,但我不想这样做。(我自己在实例化StdSerializerProvider时已经遇到了问题)

任何想法都很感激

给出了这个答案,而问题是关于验证字符串是否不包含xs以及是否转义。如果你想摆脱束缚,这个答案对你没有帮助

如何使用验证创建的对象(命令对象)

例如,对“命令对象”的字符串属性使用not@NotHtml(注释和验证)


(当然,您必须自行实现@NotHtml(@NotJavaScript或@NotXSS)注释和验证程序。)

有多种方法,具体取决于您如何识别想要转义的内容。一些想法:

  • 如果要引用/转义所有字符串,可以定义自定义字符串序列化程序
  • 您可以首先序列化为JSON树(JsonNode)——ObjectMapper.convertValue(pojo,JsonNode.class)——修改它,然后序列化为JSON(ObjectMapper.writeValue(intermediateTree))
  • 如果您想要一个灵活的系统,可以为需要特殊处理的字段添加注释,可以使用ContextualSerializer的Jackson 1.7特性;自定义序列化程序,可根据注释重新配置自身。乍一看似乎有些过分,但这可以用来轻松地指定自定义修饰符(值为Class的注释属性,它指示序列化程序可以调用的对象,以修改正在序列化的值,如escape)

这是一种可能性,但我们希望逃避输出,而不是输入。也不是,在每个字段上指定要转义的内容。除非有很好的理由不这样做:)@Stefan Hendriks:你是对的,这不是一个好方法(但我相信它会起作用)。无论如何:您不应该寻找验证字段的方法—相反,您应该以正确的方式转义内容—并且转义不应该在输入上进行,而是在将数据放入新环境中时进行。(例如,没有人在接收http输入时对其进行sql转义,相反,sql转义是在生成sql语句之前完成的。--对HTML转义也要这样做:接收时不要转义,但在生成HTML响应时,对JSON也是如此!这正是我想要做的(转义HTML)但我的问题依然存在though@Stefan亨德里克斯:在这种情况下,你应该更新你的问题(或者创建一个新的问题),因为:“但是现在我想验证一些字段以防止XSS”-是关于验证,而不是逃避。我已更正。我已更新了问题标题和引起混淆的句子。我理解您关于JSR 303的建议。(我们已经在使用该建议)。我已经使用您的第三个选项注册了一个JsonSerializer,它可以在CustomObjectMapper中转义我的字符串值。工作方式与我想要的完全相同。非常感谢!我已经为此创建了一篇博文: