1

我正在使用弹簧 MVC(弹簧 3.1.0)。
由于 XSS,我想对系统输出的每个字符串进行 html 编码。
但是有些输出(如链接)我不想以这种方式编码 - 为了做到这一点,我决定使用ContextualSerializer并创建一个实现它的类。
该方法createContextual检查是否存在自定义注释 ( @NoHTMLEscap) 并确定JsonSerializer要返回的内容。

这是我的注释:

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface NoHTMLEscap {
}

我试过了,效果很好——在 POJO 上,但这是一个失败的案例:

@Controller
@RequestMapping(value = "/something")
public class MyController {

    ...

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    @ResponseBody
    @ResponseStatus(value = HttpStatus.OK)
    public String getName(@PathVariable String id) {
         return "Here is your answer";
    }
}

Spring将返回值发送给jackson,并且由于此方法返回String而不是POJO-无法检查我的注释是否存在-因此我实际上无法在那里使用我的注释...

有没有办法将这些信息传递给杰克逊的序列化程序?
我不确定,但我想也许我需要使用一个永远不会转义字符串的弹簧专用转换器(不确定这是否能正确解决我的问题以及如何实现)?

4

1 回答 1

2

我不认为杰克逊可以为您的用例提供一个直接的实际解决方案,但我可以建议一个不同的解决方案。
如果你能负担得起围绕这些字符串的包装器对象,比如说 LinkWrapper,你可以添加另一个 LinkWrapper 序列化器,它只会委托给你当前的序列化器。在您的 LinkWrapper 对象中,您将使用您的注解对字符串进行注解,因此您的委托序列化程序将对它进行未编码的序列化。
此外,您的输出不会是对象的输出,因为您的自定义序列化程序仅委托给字符串序列化程序的输出。
如果您需要代码示例,请说,但我认为这是一个非常简单的组合案例。

于 2012-08-16T05:55:17.790 回答