我有休息服务(大约100个端点),使用JAX-RS Jersey实现。所有这些都有返回类型&#34; application / json&#34;,它可能包含一些html和javascript代码,我需要进行转义,例如&#34;&lt;&#34;应该变成<
。转义函数很容易,并且有lib。
麻烦的是,我无法在代码中找到我应该进行转义的要点。 我创建了这样的回复:
public Response response(int response, URI location, Object entity) {
Response.ResponseBuilder builder =
Response.status(response)
.location(location)
.entity(entity);
}
并且,我创建了一个类似下面的过滤器:
@Provider
public class ResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext,
ContainerResponseContext responseContext)
throws IOException
{
Object entity = responseContext.getEntity();
}
}
Object entity
可以是不同的类。
我相信,我需要知道,当Jersey将此对象实体转换为JSON字符串时,我可以转义该JSON字符串。 然而,我现在拥有的只是Object entity
,我不知道如何逃避它。
我正在考虑执行entity.toString(),然后转义该String并将其设置为实体。但是,我不确定Jersey使用toString()方法将entity
转换为JSON。
===== 例如:
public class Person{
private long id;
private String name;
private String description;
}
实际回复:
{"id": 1234,
"name": "John Doe",
"description": "<script> Some javascript code </script>"}
预期回应:
{"id": 1234,
"name": "John Doe",
"description": "<script> Some javascript code </script<"}
答案 0 :(得分:0)
您的对象在最后变为JSON(例如,在所有过滤器都通过之后) 所以你有一些选择:
在每个特定类getter(或setter)中为需要转义的字段进行转义。
public class Person{
private long id;
private String name;
private String description;
public String getDescription()
{
return doEscape(description);
}
}
或者您可以在字段中引入自己的注释,并在您的过滤器中相应地处理您的实体字段...或者做其他事情......有很多方法......
主要观点是
最后的JSON解析器只关心JSON特定的转义。对于String,它只有"
个字符。