【发布时间】:2017-03-07 07:35:02
【问题描述】:
我有休息服务(大约 100 个端点),用 JAX-RS Jersey 实现。它们都有返回类型“application/json”,其中可能包含一些html和javascript代码,我需要对其进行转义,例如,“<。转义功能很简单,并且有相应的库。
问题是,我在代码中找不到应该进行转义的点。 我创建了这样的响应:
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(),然后转义该字符串并将其设置为实体。但是,我不确定 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<"}
【问题讨论】:
-
你不需要逃避任何事情。 JSON marshaller 将您的对象转换为 JSON,为您执行此操作。
-
刚刚测试过。不,JSON 编组器根本不会自动转义它。
-
发布一个示例对象,包含示例属性,发布您期望的输出,以及您获得的输出。将其发布为正确的代码 sn-ps,因为目前,您的问题只是说:“,这不是很清楚。 JSON marsheller 将转义需要转义的内容以生成有效的 JSON。它不会 HTML 转义、XML 转义、JavaScript 转义或其他任何东西。这应该由前端完成,而不是由后端完成。
-
哦,我的错。看起来 stackoverflow 呈现转义字符。它应该是“<
-
正如我所解释的,
<不需要在 JSON 中转义。因此,如果它显示在 HTML 文档中,生成该文档的代码应该负责转义它(例如,由 Angular 等 JS 框架或 jquery 的 text() 函数自动完成)。后端不应该关心这一点:它返回数据,而前端(可以是基于 HTML 以外的任何东西,例如移动或桌面应用程序)应该在必要时转义。我想说的是,在你的 JSON 中返回 HTML,甚至更糟的是 JavaScript,是一种设计气味。