2016-07-06 35 views
0

Ich implementiere einen Dienst (als Rest), der eine POST-Methode empfängt.Stimmt es nicht, dass der Client den Zeichensatz im Feld "http-Inhaltstyp-Header" angeben muss?

Die Codierung in meinem System ist UTF-8.

Ich bin mit Jboss 5, in dem das Servlet, das die Anforderungen folgt die HTTP 1.1 Spezifikation von rfc2068, das besagt, erhält:

Wenn keine expliziten charset Parameter vom Sender zur Verfügung gestellt, Medien Subtypen vom Typ "Text" sind so definiert, dass sie bei Empfang über HTTP einen Standard-Zeichensatzwert von "ISO-8859-1" haben.

so, wenn der Client, dass mein Dienst aufruft wird beispielsweise UTF-8 verwenden und geben Sie ISO kein charset, und der Körper des POST enthält Zeichen außerhalb des US-ASCII, das Jboss Servlet geht davon aus "-8859-1 "und macht eine" falsche "Decodierung und in meinem System erhalte ich" gebrochene "Zeichen. Zum Beispiel anstelle der Zeichenfolge "día" erhalte ich "da".

Der Ansatz, den ich für "Schutz" mein System gefunden ist, den Kunden zu verlangen, die charset im content-type Parameter angeben. Wenn kein Zeichensatz angegeben wird, antworte ich mit einem http 403 und einem Text, der angibt, dass "der Zeichensatzwert angegeben werden muss".

Ist etwas falsch mit diesem Ansatz?

+0

Was passiert, wenn der Client 'Content-Type sendet: text/plain; Zeichensatz = ISO-8859-1' mit 'UTF-8' Körper? –

+0

@Luke Ich denke in diesem Fall müssen Sie einen defensiveren Ansatz als meiner nehmen. Vielleicht den Körper untersuchen. Sie können sich [diesen Beitrag] ansehen (https://stackoverflow.com/questions/499010/java-how-to-determine-the-correct-charset-encoding-of-a-stream). –

Antwort

2

RFC 2068 wurde zweimal veraltet und ist wirklich irrelevant. Sie müssen sich RFC 7231 anschauen, die keinen Standard mehr definiert. Dies bedeutet, dass der Standardwert von der Definition des Medientyps bestimmt wird.

Für text/plain bedeutet dies US-ASCII (soweit ich mich erinnere), so dass Clients, die Nicht-ASCII-Zeichen senden möchten, wirklich den Zeichensatz angeben müssen.

+0

Ja, Sie haben recht, ich habe mir die RFC 7231 angesehen, die Sie erwähnt haben, und in [rfc2046 section-4.1.2] (https://tools.ietf.org/html/rfc2046#section-4.1.2) gibt an, dass für text/plain "... der Standardzeichensatz, der bei Fehlen eines Zeichensatzparameters angenommen werden muss, US-ASCII ist." –