Wie behandeln parser Ausnahmen beim unmarshalling von JSON-Daten?
Bin ich mit dem Trikot in meiner Web-Anwendung. Die an den server gesendeten Daten im JSON format, welche wiederum unmarshallt am server-Ende und dem Objekt erhalten wird, ist in der Weiterverarbeitung. Das security-audit-hob einige Schwachstellen dieses Ansatzes.
Meine Ruhe-Code:
@POST
@Path("/registerManga")
@Produces(MediaType.APPLICATION_JSON)
public Response registerManga(MangaBean mBean){
System.out.println(mBean);
return Response.status(200).build();
}
MangaBean:
public class MangaBean {
public String title;
public String author;
@Override
public String toString() {
return "MangaBean [title=" + title + ", author=" + author + "]";
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
Werden die Daten in diesem format:
["title":"Bleach","author":"kubo tite"]
Den oben genannten Daten erfolgreich unmarshallt in ein Objekt und dies bekomme ich als Ausgabe:
MangaBean [title=Bleach, author=kubo tite]
Aber wenn die Daten geändert:
["title":"<script>alert("123");</script>","author":"kubo tite"]
Einen 500 internal server error Auftritt, und dem Benutzer angezeigt wird:
javax.servlet.ServletException: org.codehaus.jackson.JsonParseException: Unexpected character ('1' (code 49)): was expecting comma to separate OBJECT entries
at [Source: org.apache.catalina.connector.CoyoteInputStream@19bd1ca; line: 1, column: 28]
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
Das unerwartete auftreten von ""
verursacht Fehler im parser. Als unmarshalling erfolgt hinter den kulissen, und ich habe keine Kontrolle über Sie, ich bin nicht in der Lage zu handhaben, die Ausnahme, die ausgelöst wird.
Meine Frage ist, wie kann ich diese Ausnahme verarbeiten und eine angemessene Reaktion auf den Benutzer, anstatt einen stacktrace. Bitte um Rat.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Registrieren Sie einen exception-mapper zu handhaben, die JSON Parsen Ausnahmen:
beforeUnmarshal(Unmarshaller u, Object parent)
callback-Ereignis und einen listener registrieren, die nur rethrows die Ausnahme.Wenn diese exception-mapper wird nicht genannt (wie John Ding Kommentar angegeben), stellen Sie sicher, Sie haben es registriert Ihre ResourceConfig.
Auch, beachten Sie, dass bei Verwendung der JacksonFeature (mit Trikot 2.x) enthält es eine exception-mapper für diese, aber wenn Sie sich Ihrer eigenen it-Vorrang.
Hier ist ein Beispiel der Registrierung von Paket. So setzen JSONParseExceptionMapper in "Ihr.Paket.hier", und es wird abgeholt.
Für die ursprüngliche Frage, die Sie brauchen, um zu behandeln JsonMappingExceptionMapper als gut.
Zusätzlich zu @Wahrnehmung die Antwort, das fehlende Teil ist, dass die Ausnahmen bekommen verschluckt und nicht gemeldet. Sie passieren soll, ist eine Validierung Hörer:
Legen Sie einfach diesen code in Ihre JAXB bean und Ihr alle set.
Hinzufügen voll Klasse Beispiel für die Wahrnehmung Antwort
Die andere option könnte sein, die ResourceConfig, registrieren JsonParseExceptionMapper Klasse.
register(JsonParseExceptionMapper.class);
Fügen Sie die Ausnahmebehandlung Klasse im gleichen Paket(oder sub-Paket) in der erwähnten web.xml Datei