05-同源和跨域

同源和跨域

同源

同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同。

跨域问题的解决方案

从我自己的网站访问别人网站的内容,就叫跨域。

出于安全性考虑,浏览器不允许ajax跨域获取数据。

  • iframe:处于安全性考虑,浏览器的开发厂商已经禁止了这种方式。

  • JSONP:script 标签的 src 属性传递数据。

JSONP

JSONP(JSON with Padding):带补丁的 json,本质是利用了 <script src=""></script>标签具有可跨域的特性,由服务端返回一个预先定义好的JS函数的调用,并且将服务器数据以该函数参数的形式传递过来。此方法需要前后端配合完成。

我们知道, html标签的 src 属性是支持跨域的:

	<img src="http://img.smyhvae.com/2016040101.jpg" alt="">

jsonp 就是利用这个特性实现的跨域,但用的是 script 标签。如下:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>

<!-- jsonp 就是 利用 src,实现的跨域 用的是 script标签 -->
<script type="text/javascript"  src='http://192.168.141.137/2018-02-28/myData.php'></script>
</body>
</html>

上方那一行的代码,意思是:刷新A服务器上的index页面后,会去请求 B 服务器上的 myData.php 这个页面。而且请求的方式是 get 请求。

但是 B 服务器上的页面不是你想请求就可以请求的,大家一起配合才可以。

具体实现步骤:

需要首先声明的是,jsonp 只能通过 GET 方式进行请求。

(1)A客户端的代码:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>

</body>
</html>
<script type="text/javascript">

	// 定义 eatFood()方法
	function fn(data) {
		console.log('我被调用了哦');
		console.log(data);
	}
</script>

<!-- 使用 script标签 发送了 get请求 去到了一个 php页面 -->
<script type="text/javascript" src='http://192.168.141.137/01.php?callback1=fn'></script>

我们来分析上方代码中的最后一行的那个url:A 客户端请求的是 B服务器上的 01.php页面。url里有个callback1=fn,意思是:callback1是A和B 之间的约定,约定后,将执行方法 fn。

其实,fn方法已经在最后一行代码中执行了。只不过,fn方法里的data数据,是从 B 服务器中获取的。

(2)B服务器端的代码:

<?php
    $mycallBack = $_GET['callback1'];

	$arr = array("zhangsan","lisi","zhaoliu");

    echo $mycallBack."(".json_encode($arr).")";    //字符串拼接
?>

代码解释:

第一行的callback1 是A和B之间的约定,二者必须一致。

echo语句中输出的内容,即要返回给A客户端的内容,此内容会保存在 A 客户端的fn方法的data里。 data[0]指的是 zhangsan。

json_encode指的是,将php对象转化为 json。

刷新A页面,输出结果为:

	mycallBack(["zhangsan","lisi","zhaoliu"])

jQuery 中的 JSONP

我们知道,jQuery 中发送 Ajax 请求,格式是:

		$("#btn").click(function(){
			$.ajax({
				url:"./data.php?callback1=fn",
				dataType:"jsonp",
				type:"get",
				//jsonp:"callback1",   //传递给B服务器的回调函数的名字(默认为 callback)
				//jsonCallBack:"fn"    //自定义的函数名称。默认为 jQuery 自动生成的随机函数名
				success:function(data){
					alert(data);
					//$("#showInfo").html(data);
				},
				error:function(e){
					console.log(e);
				}
			});
		});

那如果数据是 JSONP,上方代码则改为:

		$("#btn").click(function(){
			$.ajax({
				url:"./data.php?fn",
				dataType:"text",
				type:"get",
				success:function(data){
					alert(data);
					//$("#showInfo").html(data);
				},
				error:function(e){
					console.log(e);
				}
			});
		});

参考链接

参考链接:https://www.cnblogs.com/2050/p/3191744.html

<think>嗯,用户现在问的是如何处理没有的情况以及如何配置设置。根据之前的对话历史,用户之前的问题是关于点击图片后光标变为图片的实现,其中涉及到了处理。现在用户想更深入地了解相关的问题,特别是当没有时的情况以及具体的配置方法。首先,我需要回顾用户提供的引用内容。引用[1]解释了问题的原因,即同源策略导致前后端分离后的请求被拦截,并提到预检请求CORS配置。引用[2]给出了Nginx配置的例子,引用[3]展示了SpringBoot的三种配置方案。用户现在的问题是如何处理没有的情况,也就是同源的情况,以及如何配置设置。我需要先明确“没有的情况”指的是什么。根据引用[1],当项目未前后端分离时,比如使用JSP、PHP等,前后端代码在同一服务器上,属于同源,不会触发问题。这时候不需要任何配置,请求可以正常进行。所以处理没有的情况,其实就是确保前后端同源,或者项目未分离,自然不存在问题。接下来,用户可能想知道如何配置设置。根据提供的引用,配置方法因服务器不同而不同。比如Nginx的配置,SpringBoot的CORS配置。需要分点说明不同服务器的配置方法,并强调同源的区别。另外,用户可能混淆了“没有”的情况是否需要配置。需要明确说明,同源下无需配置,只有在请求时才需要配置CORS。同时,可能需要解释为什么有时候即使没有配置也能正常工作,即同源的情况。还要注意用户提到的预检请求,当请求方法是GET、POST以外的,或者有自定义头时,浏览器会发送预检请求(OPTIONS),服务器需要正确响应这些请求才能通过CORS。这可能需要在配置中允许OPTIONS方法,设置允许的头部等。 总结回答结构应该包括:1.同源(无)的情况说明2.配置的必要性3.不同服务器(如Nginx、Spring Boot)的具体配置方法4.注意事项,如安全性、允许的方法头信息需要确保引用正确,比如引用[1]说明同源策略,引用[2][3]提供配置示例。同时,用户可能在实际操作中遇到问题,比如配置后仍然出现错误,可能需要检查配置是否正确,是否所有必要的头信息都设置了,比如Access-Control-Allow-Origin、Allow-Methods等。 最后,生成相关问题需要考虑用户可能遇到的后续问题,比如如何测试配置是否生效,或者如何处理复杂场景(如多个名、携带凭证等)。</think>### 问题处理指南 #### 一、无场景的处理 1. **同源场景** - 当项目采用传统架构(如JSP、PHP等未前后端分离的方案)时,前端页面与后端接口**同源**(协议+名+端口完全相同),浏览器不会触发限制[^1] - 示例: ```text 前端地址:http://example.com:8080/index.jsp 后端接口:http://example.com:8080/api/getData ``` - 无需任何配置即可直接通信 2. **开发环境代理** 在本地开发时,通过Webpack/Vite的代理配置隐藏: ```javascript // vite.config.js export default { server: { proxy: { '/api': { target: 'http://localhost:3000', changeOrigin: true } } } } ``` 此时浏览器感知的请求地址仍为当前名[^1] #### 二、配置方法 1. **Nginx配置** ```nginx server { listen 80; server_name example.com; location /api { # 允许 add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,Content-Type'; # 处理预检请求 if ($request_method = 'OPTIONS') { add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; return 204; } proxy_pass http://backend-server; } } ``` > 关键配置项: > - `Access-Control-Allow-Origin`: 允许的源(*表示所有) > - `Access-Control-Allow-Methods`: 允许的HTTP方法 > - `Access-Control-Allow-Headers`: 允许的请求头[^2] 2. **Spring Boot配置** ```java @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://trusted-domain.com") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("*") .allowCredentials(true) .maxAge(3600); } } ``` > 安全建议: > - 避免使用`allowedOrigins("*")` > - 明确指定`allowedMethods` > - 启用凭证时需指定具体名[^3] #### 三、配置验证流程 1. 检查响应头是否包含CORS相关字段 ```bash curl -I -X OPTIONS http://api.example.com ``` 2. 验证预检请求响应状态码是否为204 3. 使用浏览器开发者工具查看Network面板的请求头响应头 #### 四、特殊场景处理 1. **携带凭证的请求** ```javascript // 前端设置 fetch(url, { credentials: 'include' }); // 后端配置 Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: http://specific-domain.com // 必须明确指定名 ``` 2. **自定义请求头处理** ```nginx add_header 'Access-Control-Allow-Headers' 'X-Custom-Header,Content-Type'; ``` #### 五、安全注意事项 1. 生产环境禁止使用通配符`*`配置 2. 限制允许的HTTP方法范围 3. 设置合理的`Access-Control-Max-Age`缓存时间 4. 对敏感接口启用CSRF保护
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ـ٨ـﮩﮩ٨ـ千帆ﮩ٨、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值