【问题标题】:JAX-RS WHERE to escape response bodyJAX-RS WHERE 转义响应体
【发布时间】: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": "&lt;script&gt; Some javascript code &lt;/script&lt;"}

【问题讨论】:

  • 你不需要逃避任何事情。 JSON marshaller 将您的对象转换为 JSON,为您执行此操作。
  • 刚刚测试过。不,JSON 编组器根本不会自动转义它。
  • 发布一个示例对象,包含示例属性,发布您期望的输出,以及您获得的输出。将其发布为正确的代码 sn-ps,因为目前,您的问题只是说:“,这不是很清楚。 JSON marsheller 将转义需要转义的内容以生成有效的 JSON。它不会 HTML 转义、XML 转义、JavaScript 转义或其他任何东西。这应该由前端完成,而不是由后端完成。
  • 哦,我的错。看起来 stackoverflow 呈现转义字符。它应该是“&lt;
  • 正如我所解释的,&lt; 不需要在 JSON 中转义。因此,如果它显示在 HTML 文档中,生成该文档的代码应该负责转义它(例如,由 Angular 等 JS 框架或 jquery 的 text() 函数自动完成)。后端不应该关心这一点:它返回数据,而前端(可以是基于 HTML 以外的任何东西,例如移动或桌面应用程序)应该在必要时转义。我想说的是,在你的 JSON 中返回 HTML,甚至更糟的是 JavaScript,是一种设计气味。

标签: java rest jersey jax-rs


【解决方案1】:

您的对象在最后变成 JSON,(例如,在您的所有过滤器都通过之后) 所以你有一些选择:

在每个特定的类 getter(或 setter)中为您需要转义的字段进行转义。

     public class Person{
       private long id;
       private String name;
       private String description;

       public String getDescription()
       {
         return doEscape(description);
       }
    }

或者您可以在字段中引入您自己的注释并在您的过滤器中相应地处理您的实体字段...或者做其他事情...有很多方法...

重点是 最后的 JSON 解析器只关心 JSON 特定的转义。对于字符串,它只是" 字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-19
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2020-12-07
    • 1970-01-01
    相关资源
    最近更新 更多