使用Jackson序列化对象时编辑String字段值

时间:2015-10-22 09:43:26

标签: java json serialization jackson xss

在Spring MVC项目中,我有控制器以各种对象的形式返回数据。稍后,这些对象被序列化为JSON,并且JSON作为对客户端的响应而返回。

这是通过在应用程序配置中注册自定义MappingJackson2HttpMessageConverterconfigureMessageConverters()来实现的。转换器使用

jackson.databind.ObjectWriter.writeValue(jackson.core.JsonGenerator, object)

用于对象序列化。

现在我需要实施XSS保护。由于所有数据都经过序列化步骤,我想在此处过滤字符串值,删除除白名单中的所有符号(字母数字和一些标点符号)。

有没有办法为Jackson提供一个过滤器,可以在序列化过程中编辑String值?

1 个答案:

答案 0 :(得分:1)

我有一个MappingJackson2HttpMessageConverter的实例。在方法writeInternal(Object object, HttpOutputMessage outputMessage)中,我创建了一个自定义映射器的实例:mapper = new KJsonMapper();然后在此处使用此映射器生成JSON。

KJsonMapper.java:

public class KJsonMapper extends ObjectMapper {

    public KJsonMapper() {
        enableAntiXSS();
    }

    private void enableAntiXSS() {
        SimpleModule module = new SimpleModule("Anti-XSS Serializer",
            new Version(1, 0, 0, "FINAL", "klab", "klab.anti-xss-serializer"));
        module.addSerializer(String.class, new KJsonAntiXssSerializer());
        registerModule(module);
    }
}

映射器本身使用自定义JsonSerializer,它提供反xss过滤。

KJsonAntiXssSerializer.java:

public class KJsonAntiXssSerializer extends JsonSerializer<String> {

    public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
            throws IOException {
        if (value == null) {
            return;
        }
        String encodedValue = antiXss(value);
        jsonGenerator.writeString(encodedValue);
    }

    private String antiXss(String value) {
        // return processed value from here
    }
}