JAX-RS WHERE转义响应正文

时间:2017-03-06 20:33:11

标签: java rest jersey jax-rs

我有休息服务(大约100个端点),使用JAX-RS Jersey实现。所有这些都有返回类型" application / json",它可能包含一些html和javascript代码,我需要进行转义,例如"<"应该变成<。转义函数很容易,并且有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": "&lt;script&gt; Some javascript code &lt;/script&lt;"}

1 个答案:

答案 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,它只有"个字符。