React 使用 axios 发送的请求,是在服务端完成的吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
1oNflow
V2EX    Javascript

React 使用 axios 发送的请求,是在服务端完成的吗?

  •  
  •   1oNflow 2020-05-11 19:44:38 +08:00 3459 次点击
    这是一个创建于 1987 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前端入门中,如果有理解错误请指教。

    最近做了一个前后端分离的应用,后端 Java,前端 React ( Router,Hook ),部署在同一台服务器上的不同端口(后端 8080,前端 8081 )。

    React 某个页面用 axios 向 8080 端口的 API 发送 Get 请求时,因为没做 CORS 设置,显示连接被拒绝。浏览器控制台显示是从服务器的 ip:8081 发起向服务器 ip:8080 的请求,但是我理解 html 和 js 不是运行在用户的浏览器环境里的吗,网络请求也应该是由浏览器发起的,这样发送的 Get 请求的源地址不应该是我自己电脑的 ip 地址?

    所以 axios 是在服务端( node 启动那里)运行的吗,这样如果多个用户同时访问前端并发送请求,不就无法通过 ip 和端口来区分了?

    12 条回复    2020-05-12 13:44:52 +08:00
    yuang
        1
    yuang  
       2020-05-11 19:49:02 +08:00 via Android   2
    axios 只是发出请 XMLRequest 并处理响应,请求本身是在后端完成的。请求实际是完成了的,只是浏览器跨域了,把结果给屏蔽了
    yhxx
        2
    yhxx  
       2020-05-11 20:19:37 +08:00   1
    盲猜你的前端是在服务器上运行类似 npm run dev 的命令从而通过 8081 端口提供访问?

    如果是这样的话,你可能需要调整一下

    用户应该通过 80 或者 443 端口访问静态资源
    crystom
        3
    crystom  
       2020-05-11 20:26:42 +08:00   1
    只是理解问题,那个报错并不是指 http 请求从服务器的 ip:8081 发起向服务器 ip:8080,而是指当前页面和请求在不同域,所以浏览器给你屏蔽了
    windychen0
        4
    windychen0  
       2020-05-11 21:07:39 +08:00   1
    .html 和 js 文件已经被下载到客户的浏览器上了,所以请求是从客户机到你的 8080 端口,req 里 origin 只是告诉你请求从哪个地址发起的,这个是可以伪造的,至于区分问题,http 本身是无状态协议,想要区分只能靠后端发的证书,比如 token 或者 cookie 证明,顺便说下 2 楼答的没在点子上,端口不是必须的,只是约定俗成的
    1oNflow
        5
    1oNflow  
    OP
       2020-05-11 21:10:11 +08:00 via iPhone
    @yuang
    @crystom 感谢回复,懂了,是我理解错了。


    @yhxx 是的,因为想先测试一下,我后续调整一下
    1oNflow
        6
    1oNflow  
    OP
       2020-05-11 21:11:20 +08:00 via iPhone
    @windychen0 感谢,这下搞懂了
    enrio
        7
    enrio  
       2020-05-12 09:03:17 +08:00   1
    要看你是用哪种开发方式,如果是开发阶段,你的前端发送一个接口请求,这时候地址是你的 node 服务器,然后 node 作为一个代理,再把这个请求发给你的后端,后端响应 node,node 再响应前端。如果是生产阶段,是没有 node 服务器这一层的,最终的结果就是一些静态文件,需要你放在 nginx 这种 web 服务器之中使用,这时候的接口调用请求就是直接到后端服务器。其实为了规避跨域的问题,我们一般会使用 nginx 的反向代理来实现接口的调用,从前端看起来端口还是 web 服务器的端口。
    你说在开发阶段,因为 IP 相同无法区分用户?其实我们很少通过 IP 来区分用户,要么是 session,要么是 cookie,node 作为代理层也会把这个头部发送给后端服务器,后端拿到这个头部就能区分用户了。
    我觉得这些东西不算难,但是如果不理解的话感觉就很晕乎。
    yhxx
        8
    yhxx  
       2020-05-12 09:21:59 +08:00
    @windychen0 重点不在端口,我的意思是前端资源不应该在服务器上再启动一个 node 服务来提供访问,直接用 nginx 之类的就可以了
    fumichael
        9
    fumichael  
       2020-05-12 10:12:07 +08:00
    浏览器同源策略,跨域了,可以用 nginx 做一下代理转发
    iamppz
        10
    iamppz  
       2020-05-12 10:12:45 +08:00   1
    看描述应该不是 SSR,所以请求是从浏览器出去的,但是因为跨域被拦截了,服务端需要加上允许跨域的配置,例如 SpringBoot:
    ```java
    @Bean
    public FilterRegistrationBean corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration cOnfig= new CorsConfiguration();
    config.setAllowCredentials(true);
    // 粗暴一点
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    source.registerCosConfiguration("/**", config);
    FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
    bean.setOrder(0);
    return bean;
    }
    ```
    iamppz
        11
    iamppz  
       2020-05-12 10:14:46 +08:00
    此外如楼上所说用 Nginx 转发也可以 V 站的 Markdown 到底怎么用啊……
    yiyi11
        12
    yiyi11  
       2020-05-12 13:44:52 +08:00   1
    浏览器同源策略,同协议,同域名,同端口。不管 nignx 还是 node (一般选用 nginx ),在本例中,首要作用就是作为一个提供静态资源的服务器,即 html,css,js 。
    浏览器请求 nginx,获取静态资源文件。获取到的 js,发送 ajax 请求,根据浏览器同源策略,如果不设置跨域,它只能发回给 nginx (原路返回),然后 nginx 提供另一个关键作用就是作为路由器,转发请求到后端服务,而服务器之间没有同源策略的限制。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3851 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 10:29 PVG 18:29 LAX 03:29 JFK 06:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86