HTTP 303 Oracle ORDS 更新

问题描述

在用户进行POST之后,我需要将用户重定向到另一个端点,但是另一个端点仅接受GET请求。

正如Wiki所述,HTTP代码303应该告诉客户端将请求发送到另一个位置,并将方法更改为GET:

如果服务器使用303 See Other响应和位置标头的值响应POST或其他非幂等请求,则期望客户端使用GET方法获得位置标头中提到的资源({{ 3}})。

但是在响应之后,客户端将再次使用POST进行重定向。我用失眠测试了端点,这是时间轴输出:

* 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

第一个响应是通过OWA_UTIL包生成的,如下所示:

 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版本18.4。

更新

当浏览器发出相同的请求时,响应代码为403(以下错误),并且重定向永远不会发生。

由于该资源不支持跨源共享请求,或者该源没有被授权访问此资源,因此无法处理该请求。如果ords被反向代理,请确保前端服务器正在传播主机名,对于mod_proxy,请确保ProxyPreserveHost设置为On

解决方法

如果尝试将用户转发到的端点在同一主机/模块中,则可以使用ORDS 18.3中引入的:FORWARD_LOCATION隐式绑定参数。

如果没有,请尝试使用ORDS响应标头,而不要使用OWA_UTIL来设置用户应重定向到的新位置。我有一个如何here的示例。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...