求醉的松鼠 · 木村拓哉日剧百度网盘 - 百度· 2 周前 · |
潇洒的机器猫 · 「电脑软件」动漫电影MKV格式快速无损转换M ...· 1 周前 · |
很拉风的酱牛肉 · 李祥庭-幽居(古琴独奏)[正版CD原抓WAV ...· 6 天前 · |
礼貌的领带 · ubuntu ...· 昨天 · |
沉稳的麻辣香锅 · 请回答我1988网盘 - 百度· 17 小时前 · |
果断的海豚 · MongoDB 空值数组查询 - ...· 4 月前 · |
健壮的山寨机 · 使用python如何提取JSON数据指定内容 ...· 7 月前 · |
个性的木耳 · JMeter / Beanshell ...· 1 年前 · |
多情的黑框眼镜 · 使用 vite 代替 webpack 搭建 ...· 1 年前 · |
绅士的毛巾 · vb6中字符串转控件名的方法_chinabo ...· 1 年前 · |
我正在尝试从HP Alm的REST API中获取一些数据。它和一个小的curl脚本一起工作得很好--我得到了我的数据。
现在,使用JavaScript、fetch和ES6 (或多或少)来做这件事似乎是一个更大的问题。我一直收到这个错误消息:
Fetch API无法加载。对印前检查请求的响应未通过访问控制检查:请求的资源上不存在“access - control -Allow-Origin”标头。起源‘
http://127.0.0.1:3000
‘是不允许访问的。响应的HTTP状态代码为501。如果不透明的响应满足您的需求,请将请求的模式设置为'no- CORS‘,以便在禁用CORS的情况下获取资源。
我知道这是因为我试图从本地主机中获取数据,而解决方案应该是使用CORS。现在我以为我真的做到了,但不知何故,它要么忽略了我在标题中写的内容,要么问题出在其他地方?
那么,是否存在实现问题?我做错了吗?不幸的是,我不能检查服务器日志。我真的被困在这里了。
function performSignIn() {
let headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Accept', 'application/json');
headers.append('Access-Control-Allow-Origin', 'http://localhost:3000');
headers.append('Access-Control-Allow-Credentials', 'true');
headers.append('GET', 'POST', 'OPTIONS');
headers.append('Authorization', 'Basic ' + base64.encode(username + ":" + password));
fetch(sign_in, {
//mode: 'no-cors',
credentials: 'include',
method: 'POST',
headers: headers
.then(response => response.json())
.then(json => console.log(json))
.catch(error => console.log('Authorization failed : ' + error.message));
}
我正在使用Chrome。我也尝试过使用Chrome CORS插件,但随后收到了另一条错误消息:
响应中的“Access-Control-Allow-Origin”标头的值不能是通配符“
*
‘当请求的凭据模式为'include’时。起源‘
http://127.0.0.1:3000
‘是不允许访问的。由withCredentials属性控制XMLHttpRequest发起的请求的凭据模式。
删除此命令:
credentials: 'include',
使用
对我很管用。
async function get_ajax_data(){
var _reprojected_lat_lng = await $.ajax({
type: 'GET',
dataType: 'jsonp',
data: {},
url: _reprojection_url,
error: function (jqXHR, textStatus, errorThrown) {
console.log(jqXHR)
success: function (data) {
console.log(data);
// note: data is already json type, you
// just specify dataType: jsonp
return data;
} // function
我正在使用Spring REST,我在WebMvcConfigurer中添加AllowedMethods解决了这个问题。
@Value( "${app.allow.origins}" )
private String allowOrigins;
@Bean
public WebMvcConfigurer corsConfigurer() {
System.out.println("allow origin: "+allowOrigins);
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
//.allowedOrigins("http://localhost")
.allowedOrigins(allowOrigins)
.allowedMethods("PUT", "DELETE","GET", "POST");
}
出现问题的原因是您将以下代码添加为
请求
前端的标题:
headers.append('Access-Control-Allow-Origin', 'http://localhost:3000');
headers.append('Access-Control-Allow-Credentials', 'true');
这些标头属于
响应
,而不是请求。所以
删除
它们,包括这一行:
headers.append('GET', 'POST', 'OPTIONS');
您的请求
,因此触发了所谓的CORS预检。这导致浏览器使用OPTIONS方法发送请求。请参见
CORS印前检查
获取详细信息。
因此,在您的
后端
,您必须通过返回响应头来处理这个预加载的请求,这些响应头包括:
Access-Control-Allow-Origin : http://localhost:3000
Access-Control-Allow-Credentials : true
Access-Control-Allow-Methods : GET, POST, OPTIONS
Access-Control-Allow-Headers : Origin, Content-Type, Accept
当然,实际的语法取决于后端使用的编程语言。
在你的前端,它应该是这样的:
function performSignIn() {
let headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Accept', 'application/json');
headers.append('Authorization', 'Basic ' + base64.encode(username + ":" + password));
headers.append('Origin','http://localhost:3000');
fetch(sign_in, {
mode: 'cors',
credentials: 'include',
method: 'POST',
headers: headers
.then(response => response.json())
.then(json => console.log(json))
.catch(error => console.log('Authorization failed : ' + error.message));
}
这只是我的两个观点..。关于
如何使用CORS代理来绕过“No”
header“问题
对于那些在后台使用php的人来说,部署"CORS代理“非常简单:
创建一个名为'no-cors.php‘的文件,内容如下:
$URL =$
_
获取
‘'url’
;echo json
_
编码(文件
_
获取
_
contents($URL));die();
在你的前端,做一些像这样的事情:
fetch(‘
https://example.com/no-cors.php
‘+ '?url=’+ url) .then(response=>{
*
/Handle响应/
*
})`
在我的例子中,web服务器阻止了"OPTIONS“方法
检查web服务器中的options方法
apache:
https://www-01.ibm.com/support/docview.wss?uid=ibm10735209
webtier : 4.4.6禁用Options方法
https://docs.oracle.com/cd/E23943
_
01/web.1111/e10144/getstart.htm#HSADM174
nginx:
https://medium.com/@hariomvashisth/cors-on-nginx-be38dd0e19df
我用的是"webtier“
/www/webtier/domain/
域名
/config/fmwconfig/components/OHS/VCWeb1/httpd.conf
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^OPTIONS
RewriteRule .* . [F]
更改为
RewriteEngine off
RewriteCond %{REQUEST_METHOD} ^OPTIONS
RewriteRule .* . [F]
在我的例子中,我使用以下解决方案
前端或角度
post(
this.serverUrl, dataObjToPost,
headers: new HttpHeaders({
'Content-Type': 'application/json',
)
后端(我使用php)
header("Access-Control-Allow-Origin: http://localhost:4200");
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header("Access-Control-Allow-Headers: Content-Type, Authorization");
$postdata = file_get_contents("php://input");
$request = json_decode($postdata);
print_r($request);
如果您在MacOS的开发环境中使用NodeJS/Express作为后端,而ReactJS/axios作为前端,则需要在https下运行两端。下面是它最终对我起作用的方法(经过几个小时的深入研究和测试):
第1步:创建SSL证书
只需按照中的步骤操作即可
如何在5分钟内让HTTPS在您的本地开发环境中运行
您最终将获得两个文件,它们将用作运行https服务器和ReactJS web的凭据:
server.key & server.crt
您需要将它们复制到前端和后端的根文件夹中(在生产环境中,您可以考虑将它们复制到./ssh作为后端)。
第2步:后端设置
我读到了很多建议使用'cors‘包甚至设置('Access-Control-Allow-Origin',’
*
'),这就像是在说:“欢迎黑客访问我的网站”。如下所示:
import express from 'express';
const emailRouter = require('./routes/email'); // in my case, I was sending an email through a form in ReactJS
const fs = require('fs');
const https = require('https');
const app = express();
const port = 8000;
// CORS (Cross-Origin Resource Sharing) headers to support Cross-site HTTP requests
app.all('*', (req, res, next) => {
res.header("Access-Control-Allow-Origin", "https://localhost:3000");
next();
// Routes definition
app.use('/email', emailRouter);
// HTTPS server
const credentials = {
key: fs.readFileSync('server.key'),
cert: fs.readFileSync('server.crt')
const httpsServer = https.createServer(credentials, app);
httpsServer.listen(port, () => {
console.log(`Back-end running on port ${port}`);
});
如果您想测试https是否正常,可以将httpsServer常量替换为以下常量:
https.createServer(credentials, (req: any, res: any) => {
res.writeHead(200);
res.end("hello world from SSL\n");
}).listen(port, () => {
console.log(`HTTPS server listening on port ${port}...`);
});
然后从web浏览器访问它:
https://localhost:8000/
第3步:前端设置
这是来自ReactJS前端的axios请求:
await axios.get(`https://localhost:8000/email/send`, {
params: {/* whatever data you want to send */ },
headers: {
'Content-Type': 'application/json',
})
现在,您需要使用我们已经创建的ReactJS凭据在https模式下启动SSL。在您的MacOS终端中键入以下内容:
HTTPS=true SSL_CRT_FILE=server.crt SSL_KEY_FILE=server.key npm start
此时,您正在从前端的端口3000处的https连接发送一个请求,后端将通过端口8000处的https连接接收该请求。CORS应该对此感到高兴;)
使用Nodejs时,如果您使用的是路由器,请确保在路由器之前添加cors。否则,您仍然会得到cors错误。如下所示:
const cors = require('cors');
const userRouter = require('./routers/user');
expressApp = express();
expressApp.use(cors());
expressApp.use(express.json());
expressApp.use(userRouter);