坐下来聊一聊,跨域

1.首先要了解什么叫跨域?跨域和不跨域有什么区别

	1,首先什么叫“域”?
		故名思意就是区域的意思,假设现在有三台服务器A(http://66.66.66.66:8081),
	B(http://66.66.66.66:8082),C(http://77.77.77.77:8081);场景:A是一台展示你登录微信界面的服务器,
	B是一台验证你登录微信的服务器,C是一个看小视频的服务器;

	2,A,B,C的端口,协议,ip都不相同所以把它们分为三个区域,参考浏览器的
	同源策略(https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy)
	
	3,如果是跨域请求,浏览器内核默认不会携带cookie;
			cookie:在浏览器端存储信息的一块内存
			response.addCookie(new Cookie("myCookie",“123456”))----后端在请求头中增加了一个header:"set-Cookie"
			Cookie参数有:
							Name:myCookie
							Value:123456
							Domain:localhost  //作用域范围
							Path :/data     //前端发生请求时的路径中包含/data就会去cookie存储区拿到cookie值并携带
											(浏览器内核的默认操作。发生在非跨域请求,或跨域请求允许携带cookie时)
							Expires:Thu, 19 Sep 2019 01:36:08 GMT  //过期时间
							HttpOnly:false   //是否允许前端通过js得到
							Secure:false  //规定是否通过安全的 HTTPS 连接来传输 cookie。

2.跨域产生初识

现在你在A服务上填写你的 用户名+密码 点击登录  发送请求到B服务器,这就产生了跨域请求。

3.为什么有跨域概念?它干了什么?

	1.前端向后台发送请求的几种方式:
	
		1.1,通过表单提交参数(form表单)
        	<form action="" method="post">
          	 	 用户名:<input type="text" name="username"/><button>提交</button>
        	</form>
        1.2,通过链接提交参数(a标签)
        	<a href="">删除</a>
        1.3,通过js提交参数(xmlHttpRequest方式,包括很多框架,其实都封装了xmlHttpRequest方式;如Ajax,axio等)
        	<input type="text" name="username"/><button onclick="fn()">发送请求</button>
       	1.4,通过script发送请求
        		<script src="http://example.com/index.php?arg=val1&jsonp=callback"/>
		1.5,通过link发送请求
				<link rel="stylesheet" href="...">
	2.说跨域为什么要扯到前端发送请求的几种方式?
		在发送请求的时候浏览器内核会解析html标签,当遇到XMLHttpRequest请求时,常用的Ajax,为了安全考虑它会特别“警惕”,
		首先它会判断你的请求是否跨域(A--访问B就产生跨域),如何跨域它会在你的请求头中加上Origin字段来表明本次请求
		是跨域并且我是A;其次它会判断当前请求是“简单请求”还是“复杂请求”(先看完下面:两种请求)如果是“简单请求”直接发送
		本次请求,如果是“复杂请求”:
			它会发送一次预请求,请求的方法方法名为OPTIONS,请求的主要头部信息有:
				Access-Control-Request-Headers: content-type,token  //我想发送一次跨域请求,请求头中字段有content-type,token
				Access-Control-Request-Method: POST  //我想发送一次跨域请求,请求方法是post
				Origin: A     //我想发送一次跨域请求,我是A
						然后B收到A的预请求,如果响应结果为200就表示,A这次预请求通过,可以正式发送请求;
			A收到的响应头部信息主要:
				Access-Control-Allow-Headers: content-type,token  //允许跨域请求的头部信息只能是content-type,token
				Access-Control-Allow-Methods: GET,POST,OPTIONS,PUT,DELETE  //允许跨域的方法名只能是GET,POST,OPTIONS,PUT,DELETE
				Access-control-Allow-Origin: A    //允许跨域的源域是A
				Access-Control-Max-Age: 60*30   //允许不用发送预请求的间隔时间30分钟
				Access-Control-Allow-Credentials","true"  //允许携带证数(cookie)

4.两种请求;简单请求和复杂请求

	1.简单请求
			(1) 请求方法是以下三种方法之一:
					HEAD
					GET
					POST
			(2)HTTP的头信息不超出以下几种字段:
					Accept
					Accept-Language
					Content-Language
					Last-Event-ID
					Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
	2.复杂请求(除去简单请求都是复杂请求)
			如:
			Request URL:www.baidu.com/user
			Request Method: POST
			Content-Type: application/json;charset=UTF-8

5.跨域解决了什么问题?带来什么问题?

	1:如果不存在跨域
		场景:用户在A上输入用户名,密码,发送请求到B上登录成功;B将登录信息生成凭证返回给A存到Cookie中,这是用户又打开非法的C网站
		C网站发送非法请求给B,这时浏览器内核会去检查路径并也携带上B给A生成的凭证cookie;然后c网站就能以A网站的名义为所欲为。这就是		
		著名的CSRF:跨站请求伪造攻击。(浅谈csrf攻击)https://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
	2:带来的问题
		前后端分离的项目中;不能直接发送xmlhttprequest请求,或携带cookie;

6.如何解决跨域和跨域携带cookie

	请参考我另外一篇文章:(前后端分离跨域问题)https://blog.csdn.net/qq_44742816/article/details/99485673?utm_source=app

7.以上内容为自己总结,如有错误欢迎指正,及欢迎补充。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
是指在一个名下的文档或脚本试图去请求另一个名下的资源时,浏览器为了安全,会阻止这种行为。问题是由浏览器的同源策略(Same Origin Policy)引起的。同源策略是浏览器的一种安全机制,它限制了从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。 在Tomcat上解决问题,可以通过配置CORS(Cross-Origin Resource Sharing)来实现。CORS是W3C规范,它允许在服务器端配置允许访问的白名单。 下面是一个简单的Tomcat配置示例: 1. 在Tomcat的conf目录下找到server.xml文件,在<Host>标签中添加以下配置: ```xml <Context path="/" docBase="your_doc_base" debug="0" reloadable="true"> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127.0.0.1" /> <Filter className="org.apache.catalina.filters.CorsFilter"/> <FilterMapping filterName="CorsFilter" urlPattern="/*"/> </Context> ``` 2. 在Tomcat的lib目录下找到catalina.jar文件,将其解压。 3. 将解压后的catalina.jar中的META-INF目录下的context.xml文件拷贝到Tomcat的conf目录下,并修改其中的以下配置: ```xml <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127.0.0.1" /> <Filter className="org.apache.catalina.filters.CorsFilter"/> <FilterMapping filterName="CorsFilter" urlPattern="/*"/> ``` 4. 重启Tomcat。 以上就是一个简单的Tomcat配置示例,如果您有其他问题或疑问,可以随时向我提出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值