4 Stimmen

Benutzerdefinierte Annotationen zum Festlegen von HTTP-Antwortheadern in einem JAX-RS-Dienst.

Ich habe einen JAX-RS-Webservice, für den ich die Same-Origin-Richtlinie über die neuen CORS-HTTP-Header deaktivieren möchte. (Mir sind die Sicherheitsimplikationen vollständig bewusst.)

Ich möchte eine benutzerdefinierte Annotation haben, die es mir ermöglicht, HTTP-Antwortheader festzulegen. Zum Beispiel,

@ResponseHeaders({"Access-Control-Allow-Origin: *",
                  "Access-Control-Allow-Methods: GET"})
// Oder alternativ:
@AllowOrigins({"*"})
public String resourceMethod() { ... }

Dieser Ansatz minimiert den Boilerplate-Code, aber ich bin mir nicht sicher, ob es eine subtile technische Einschränkung gibt; JAX-RS bietet viele Annotationen zur Verarbeitung des HTTP-Requests, aber nicht der Antwort, wobei @Produces die einzige Ausnahme zu sein scheint.

Ich ziehe es auch vor, möglichst wenig Web.xml-Konfiguration zu verwenden. Ohne explizit einen ResponseBuilder verwenden zu müssen (es ist in Ordnung, wenn eine Annotation einen verwendet), gibt es einen sauberen Weg, benutzerdefinierte HTTP-Antwortheader festzulegen?

Zur Klarstellung: Ich suche nach Annotationen, die mit den verschiedenen Möglichkeiten zur Festlegung von HTTP-Antwortheadern integrieren, um den Boilerplate-Code zu minimieren.

0voto

Bryant Luk Punkte 2439

Vielleicht ist der einzige spezifikationsbasierte Ansatz, einen benutzerdefinierten MessageBodyWriter zu verwenden. Im writeTo() -Methode wird Ihnen ein MultivaluedMap übergeben, auf dem Sie Antwortheader setzen können. Ihnen werden auch die Annotationen auf der aufgerufenen Ressourcenmethode übergeben (damit Sie beliebige benutzerdefinierte Annotationen abrufen können). Lesen Sie also die Annotationen, setzen Sie die Header über MultivaluedMap und verwenden Sie dann den übergebenen OutputStream, um den Nachrichteninhalt zu schreiben.

In Apache Wink und möglicherweise anderen JAX-RS-Frameworks können Sie benutzerdefinierte serverseitige Handler erstellen, die auch die Annotationen auf der Ressourcenmethode lesen und beliebige Aktionen durchführen können (z. B. standardmäßig Antwortheader setzen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X