当前位置: 首页 > 知识库问答 >
问题:

响应客户端不会遵循重定向CORSlocalhost

万俟沛
2023-03-14

前端:localhost:3000(反应应用程序)加载pp.js(客户端)调用api/

function fetch_redirect() {
  fetch("http://localhost:8082")
}

function App() {
  return <div className="App">{fetch_redirect()}</div>;
}

export default App;

后端:localhost:8082(nodejs express应用程序)发送重定向到客户端上的/测试endpoint

const express = require('express')
const app = express()
const cors = require('cors');

const whitelist = ['http://localhost:3000']
const corsOptions = {
  origin: function (origin, callback) {
      console.log(origin, whitelist.indexOf(origin) !== -1);
    if (whitelist.indexOf(origin) !== -1) {
      callback(null, true)
    } else {
      callback(new Error('Not allowed by CORS'))
    }
  }
}

app.use(cors(corsOptions))
app.get('/', function (req, res) {
          res.redirect('http://localhost:3000/test')
    })
     
    app.listen(8082)

主要问题在于客户端(react),一旦API调用完成,重定向将被阻止。。。如何使客户端应用程序响应此重定向到'http://localhost:3000/test'我的后端已经有cors,启用了localhost:3000的白名单,允许我使API调用不被阻止。。。但是,现在已从提取前端阻止重定向!

错误详细信息:从http://localhost:3000/test获取(从http://localhost:8082/重定向)http://localhost:3000的访问已被CORS策略阻止:请求的资源上不存在访问-控制-允许-起源标头。如果不透明的响应满足您的需求,请将请求的模式设置为no-cors,以在禁用CORS的情况下获取资源。

共有3个答案

陆高峰
2023-03-14

尝试使用下一个函数在app.get

app.get('/', function (req, res, next) {
  res.redirect('http://localhost:3000/test');
  next();
})

另外,对于您的ReactJS应用程序(我不确定您的实现,CSR或SSR),您应该添加两件事:

  • Webpack: proxy for passing CORS
    • CSR:
      devServer: {
        ...
        headers: {
          "Access-Control-Allow-Origin": "*",
          "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
          "Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
        }
      }
      
      • CSR: for running the project in the dev side use:
        devServer: {
           historyApiFallback:{
             index:'build/index.html'
           },
        },
        

毛越
2023-03-14

试着像这样重构代码:

const express = require('express')
const app = express()
const cors = require('cors');


const whitelist = ['http://localhost:3000', 'http://localhost:8082'];


const corsOptionsDelegate = (req, callback) => {
  var corsOptions;
  if (whitelist.indexOf(req.header('Origin')) !== -1) {
    corsOptions = { origin: true };
  } else {
    corsOptions = { origin: false };
  }
  callback(null, corsOptions);
};

const corsWithOptions = cors(corsOptionsDelegate);

app.route('/')
  .options(corsWithOptions, (req, res) => { res.sendStatus(200); })
  .get(cors(), (req, res)=>{
       res.redirect('http://localhost:3000/test')
});


app.listen(8082)

蓬兴国
2023-03-14

为了方便开发,并使开发环境更接近正式生产环境(不需要使用Access Control-允许-起源降低安全水位),您应该有一个独特的前端和后端切入点起源(http://localhost:3000)。

要实现这一点,请删除所有访问控制-*标题,创建src/setupProxy.js文件并按如下方式填充:

const { createProxyMiddleware } = require("http-proxy-middleware");

module.exports = app => {
  app.use(
    "/api",
    createProxyMiddleware ({
      target: "http://localhost:8082",
      changeOrigin: true
    })
  );
};

然后安装需要的快速中间件作为开发依赖,使用npm安装--save-dev超文本传输协议-proce-middleware

注意:此功能可用于react-scripts@2.0.0及更高版本。

最后,用以/api

  • 获取("http://localhost:8082")变为获取('/api')
  • 类似于getch('http://localhost:8082/some-endpoint')的东西将成为getch('/api/thum-endpoint')

有关这方面的更多信息,请参阅文档。

 类似资料:
  • 我们的混合应用程序使用网页视图,从android版本4.4.3开始,网页视图不呈现。该应用程序尝试加载HTTPS web视图,并仅停留在那里大约50秒,之后它抛出一个异常,类似于这个Android致命信号11(SIGSEGV)在0x636F7D89(代码=1)。怎么能追查到呢?。显然,我们沿着这条建议的道路走下去了,所以没有多大的效果。 通过我们的实验,我们确定了以下几点 最后一个HTTP请求/响

  • 问题内容: 我有以下python脚本,它可以很好地工作。 但是,我提供的某些URL可能会将其重定向2次或更多次。如何在加载数据之前让python等待重定向完成。例如,当使用上面的代码 这相当于在Google搜索上点击即时幸运按钮,我得到: 香港专业教育学院尝试了(URL,数据,超时),但是,我不确定该放在哪里。 编辑:我实际上发现如果我不重定向,而只是使用第一个链接的标头,我可以抓住下一个重定向的

  • 问题内容: 我想在节点中打开一个页面并处理应用程序中的内容。像这样的事情似乎运作良好: 但是,如果页面返回301/302重定向,则此操作无效。万一有多个重定向,我将如何以可重用的方式进行操作?http上方是否有包装器模块,可以更轻松地处理来自节点应用程序的http响应? 问题答案: http上方是否有包装器模块,可以更轻松地处理来自节点应用程序的http响应? 请求中的重定向逻辑

  • 这是我的应用程序属性文件: 这是我的配置类: 我做错了什么? 谢谢。

  • 我是camel的新手,我正在尝试使用camel cxf组件创建一个soap WebService。我从骆驼的样本开始。我已经配置了一个使用cxf组件的路由,并添加了一个处理器来处理请求。我在用于处理服务的bean中收到了请求,但我无法将响应发送回客户机。提前致谢 Sysout语句被打印在控制台上,但我得到的是一个空正文的soap响应。 以下是我从浏览器访问http://localhost:9080

  • 我的编程任务要求我在客户端和服务器之间创建一个代理。我的客户端通过代理向服务器发出请求,然后代理将其转发并将服务器的响应返回给客户端。 以下是我采取的步骤: 1) 从客户端获取请求并将请求数据存储到字节数组中 2) 使用缓冲读取器读取字节数组 3) 从host:header字段获取主机名,并使用它创建一个serverSocket 4) 将请求数据转发到serverSocket outputstre