我正在使用弹簧 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-无法检查我的注释是否存在-因此我实际上无法在那里使用我的注释...
有没有办法将这些信息传递给杰克逊的序列化程序?
我不确定,但我想也许我需要使用一个永远不会转义字符串的弹簧专用转换器(不确定这是否能正确解决我的问题以及如何实现)?