跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号(如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。跨域问题是针对JS和ajax的,html本身没有跨域问题,比如a标签、script标签、甚至form标签(可以直接跨域发送数据并接收数据)等。

Ajax

一、什么是跨域

域名地址的组成:

1
http:// www . google : 8080 / script/jquery.js
1
2
3
4
5
6
7
8
9
http:// (协议号)

www (子域名)

google (主域名)

8080 (端口号)

script/jquery.js (请求的地址)
  • 当协议、子域名、主域名、端口号中任意一各不相同时,都算不同的“域”。

  • 不同的域之间相互请求资源,就叫“跨域”。

比如:

http://www.abc.com/index.html 请求 http://www.def.com/sever.php


Ajax


跨域产生的原因是浏览器同源策略-SOP的限制,当前域名下的js只能读取同域的窗口属性。当使用js获取不同域名下的数据时,就会产生跨域的问题。只有双方在协议、主机和端口号都完全匹配的情况下,可以被授权访问。

需要注意的是,在服务器端是没有跨域之说的。比如我用node请求java数据时,即使两个的地址不一样,但是这个不是跨域,跨域是浏览器做的限制,防止获其他域名的cookies或者恶意的发送ajax请求等,别弄乱了,因为现在很多项目都为了前后端分离,用node做了中间层,但是对于网页来说,他是请求同域的nodejs,nodejs再转发请求,这里并没有发生跨域。至于java怎么判断这个请求是自己人,就是另一个话题了。咨询了同事,采用的一般是IP白名单或者api签名。

二、经验总结

1
2
3

//页面
<meta http-equiv="Access-Control-Allow-Origin" content="*">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

/**
* Application.java
*/
@SpringBootApplication
@RestController
@EnableSwagger2
@EnableAutoConfiguration
@ComponentScan
@EnableDiscoveryClient
@EnableHystrix
public class Application {
@Bean
public FilterRegistrationBean securityFilter() {
final FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new SecurityFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.setOrder(Integer.MAX_VALUE);
return registrationBean;
}
}

参考文章:

跨域总结–JSONP,CORS,postMessage,子域名代理

本文标题: Ajax跨域问题解决方法-技巧篇

本文作者: 狂欢马克思

发布时间: 2024年01月02日 00:00

最后更新: 2025年04月03日 11:07

原始链接: https://haoxiang.eu.org/3047a232/

版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!

× 喜欢就赞赏一下呗!
打赏二维码