HTTP 303 Oracle ORDS

Sep 10 2020

Ich muss den Benutzer zu einem anderen Endpunkt umleiten, nachdem er einen POST durchgeführt hat, aber der andere Endpunkt akzeptiert nur GET-Anforderungen.

Wie das Wiki sagt, sollte der HTTP-Code 303 den Client anweisen, eine Anfrage an einen anderen Speicherort zu senden und die Methode in GET zu ändern:

Wenn ein Server auf einen POST oder eine andere nicht idempotente Anforderung mit einer Antwort und einem Wert für den Standortheader antwortet, wird vom Client erwartet, dass er die im Standortheader angegebene Ressource mithilfe der GET-Methode ( Quelle ) erhält .

Nach der Antwort leitet der Client jedoch erneut POST um. Ich habe den Endpunkt mit Insomnia getestet und hier ist die Timeline-Ausgabe:

* Preparing request to http://******:8080/ords/demo/llmob.test_post_david
* Current time is 2020-09-10T07:21:09.418Z
* Using libcurl/7.69.1 OpenSSL/1.1.1e zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libssh2/1.9.0 nghttp2/1.29.0
* Using default HTTP version
* Disable timeout
* Enable automatic URL encoding
* Enable SSL validation
* Enable cookie sending with jar of 5 cookies
* Connection 21 seems to be dead!
* Closing connection 21
* Hostname ****** was found in DNS cache
*   Trying 192.168.254.135:8080...
* Connected to ****** (192.168.254.135) port 8080 (#22)

> POST /ords/demo/llmob.test_post_david HTTP/1.1
> Host: ******:8080
> User-Agent: insomnia/2020.3.3
> Access-Control-Allow-Origin: *
> Content-Type: multipart/form-data; boundary=X-INSOMNIA-BOUNDARY
> Accept: */*
> Content-Length: 433

| --X-INSOMNIA-BOUNDARY
| Content-Disposition: form-data; name="ShoppingCartID"
| 78


* We are completely uploaded and fine
* Mark bundle as not supporting multiuse

< HTTP/1.1 303 
< Location: http://******:8080/ords/devapex/sbas/r/self-check-out159/odobreno
< Transfer-Encoding: chunked
< Date: Thu, 10 Sep 2020 07:21:10 GMT


* Ignoring the response-body
* Received 5 B chunk
* Connection #22 to host ****** left intact
* Issue another request to this URL: 'http://******:8080/ords/devapex/sbas/r/self-check-out159/odobreno'
* Disables POST, goes with GET
* Found bundle for host ******: 0x1497368c8870 [serially]
* Can not multiplex, even if we wanted to!
* Re-using existing connection! (#22) with host ******
* Connected to ****** (192.168.254.135) port 8080 (#22)

> POST /ords/devapex/sbas/r/self-check-out159/odobreno HTTP/1.1
> Host: ******:8080
> User-Agent: insomnia/2020.3.3
> Access-Control-Allow-Origin: *
> Content-Type: multipart/form-data; boundary=X-INSOMNIA-BOUNDARY
> Accept: */*
> Content-Length: 433

| --X-INSOMNIA-BOUNDARY
| Content-Disposition: form-data; name="ShoppingCartID"
| 78

* We are completely uploaded and fine
* Mark bundle as not supporting multiuse

< HTTP/1.1 405 
< Allow: GET
< Content-Type: text/html
< Content-Length: 15798
< Date: Thu, 10 Sep 2020 07:21:10 GMT


* Received 7.9 KB chunk
* Received 7.5 KB chunk
* Connection #22 to host ****** left intact

Die erste Antwort wird mit dem OWA_UTILPaket wie folgt generiert :

 owa_util.status_line(
                         nstatus=> 303, bclose_header=> false
                         );
                         
   owa_util.redirect_url(
             curl         => 'http://******:8080/ords/devapex/sbas/r/self-check-out159/odobreno',
            bclose_header  =>TRUE
            );

ORDS Version 18.4.

Aktualisieren

Wenn dieselbe Anforderung vom Browser ausgegeben wird, lautet der Antwortcode 403 (Fehler unten), und die Umleitung erfolgt nie.

Die Anforderung kann nicht verarbeitet werden, da diese Ressource keine Cross Origin-Freigabeanforderungen unterstützt oder die Anforderung Origin nicht zum Zugriff auf diese Ressource berechtigt ist. Wenn ords als Reverse Proxy ausgeführt wird, stellen Sie sicher, dass der Front-End-Server den Hostnamen weitergibt. Stellen Sie für mod_proxy sicher, dass ProxyPreserveHost auf On gesetzt ist

Antworten

EJEgyed Sep 22 2020 at 20:59

Wenn sich Ihr Endpunkt, an den Sie den Benutzer weiterleiten :FORWARD_LOCATIONmöchten, auf demselben Host / Modul befindet, können Sie den in ORDS 18.3 eingeführten impliziten Bindungsparameter verwenden.

Wenn nicht, OWA_UTILverwenden Sie die ORDS-Antwortheader , anstatt den neuen Speicherort festzulegen , an den der Benutzer umgeleitet werden soll. Ich habe ein Beispiel dafür , wie dies zu tun hier .