2017-03-06 87 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特定的轉義。對於字符串,它只是"字符。