2017-03-06 25 views
0

我有休息服务(约100个端点),用JAX-RS Jersey实现。它们都有返回类型“application/json”,它可能包含一些html和javascript代码,为此我需要转义,例如,“<”应该变为&lt;。转义函数很容易,并且有一些库。JAX-RS WHERE逃避响应主体

麻烦的是,我无法在代码中找到应该转义的地方。 我创建这样的响应:

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;"} 
+0

你不需要转义任何东西。 JSON编组器,将您的对象转换为JSON,为您做到这一点。 –

+0

刚刚测试过。不,JSON编组人员根本不会自动转义它。 – Simo

+0

发布一个包含示例属性的示例对象,发布您期望的输出内容以及作为输出获得的内容。作为正确的代码片段发布,因为目前,你的问题只是说:*“<”应该变成“<”*,这不是很清楚。为了生成有效的JSON,JSON marsheller将转义需要转义的内容。它不会HTML转义,XML转义,JavaScript转义或其他任何东西。这应该由前端完成,而不是由后端完成。 –

回答

0

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

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

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

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

,或者你可以介绍自己的注释到外地,并在你的过滤器进行相应的处理你的实体领域......或做其他sometning ......有很多方法...

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