域名到Ip地址解析是由分布在因特网上的许多域名服务器程序共同完成的。运行域名服务器程序的机器是域名服务器
 
域名到ip地址的解析过程:
当一个应用进程需要把主机名解析为ip地址时,该应用就调用解析程序,并成为dns的一个客户,把待解析的域名放在dns请求报文中,以udp用户数据报方式发送给本地域名服务器(使用udp是为了减少开销)。本地域名服务器在查找域名后,把对应的ip地址放在回答报文中返回,应用进程获得目的主机的IP地址后即可进行通信。
若本地域名服务器不能回答该请求,则此域名服务器暂时成为dns中的另一个客户,并向其他域名服务器发出查询请求,这种过程直到找到能够回答该请求的域名服务器为止
 
域名结构:
因特网采用了层次树状结构的命名方法,例如:
mail.cctv.com (从左到右依次是三级域名.二级域名.顶级域名)
如果缺少同源策略,浏览器容易收到XSS,CSFR的攻击,所谓同源是指“协议+域名+端口”
⚠️:
1.协议和端口造成的跨域问题是“前台”无法解决的
2.在跨域问题上,仅仅通过url的首部来识别,而不会根据域名对应的IP地址是否相同来判断。URL的首部可以理解为“协议,域名和端口必须匹配
3.跨域不是请求发不出去,是请求能发出去,服务器端能收到请求并且正常返回结果,只是结果被浏览器拦截了
 
解决方案:
1.jsonp
1.jsonp原理
利用<script>标签没有跨域限制的漏洞,网页可以得到从其他来源动态产生的json数据,jsonp请求一定需要对方服务器做支持才可以
2.jsonp和ajax对比:
jsonp和ajax相同,都是客户端想服务器端发送请求,从服务器端获取数据的方式,但是ajax属于同源请求,而jsonp是非同源请求
3.jsonp仅限与get方法,并且不安全,容易收到xss攻击
4.实现流程:
- 声明一个回调函数,其函数名当做参数值,要传递给跨域请求数据的服务器,函数形参主要为获取目标数据
- 创建一个<script>标签,把哪个跨域的api数据接口地址,赋值给script的src,还要在这个地址中向服务器传递该函数名
- 服务器收到请求后,需要进行特殊处理:把传递进来的函数名和它需要给你的数据拼成泥想要的数据
- 最后服务器把准备的数据通过HTTP协议返回给客户端,客户端再调用执行之前声明的回调函数,对返回的数据进行操作
用jq实现:(jsonp是get和异步请求,不存在其他的请求方式和同步请求,且JQ默认就会jsonp的请求清除缓存)
$('#search_input').on('keyup',function(event){
var searText=$('#search_input').val();
$.ajax({
type:'get',
async:true,
dataType:'jsonp',
jsonp:'cb',
url:'http://api.bing.com/qsonhs.aspx?type=cb&q='+searchText,
success:function(data){
var data=data.AS.Results[].Suggests;
var html='';
for(var i=;i<data.length;i++){
html+='<li>'+data[i].Txt+'</li>';
}
$('#search-result').html(html);
$('#search-suggest').show().css({
top:$('#search-form').offset().top+$('#search-form').height()+;
})
}
})
}) 
2.cors
cors需要浏览器和后端同时支持,ie8和ie9需要通过XDomainRequest来实现
浏览器会自动进行cors通信,实现cors通信是后端实现
通过这种方式解决跨域问题,会在发送请求时出现两种情况,分别为简单请求和复杂请求
1)简单请求:
满足以下条件,属于简单请求:
条件1:使用下列方法之一:
- get
- head
- post
条件2:content-type的值仅限于下列三者之一:
- text/plain
- multipart/form-data
- application/x-www-form-urlencoded
⚠️:
请求中的任意XMLHttpRequestUpload对象均没有注册任何事件监听器;XMLHttpRequestUpload对象可以使用XMLHttpRequest.upload属性访问
2.复杂请求:
不符合以上条件的请求就是复杂请求
复杂请求的cors请求,会在正式通信之前,增加一次HTTP查询请求,称为“预检”请求,该请求是option方法的,通过该请求来知道服务器是否允许有跨域请求
我们用put向后台请求时,属于复杂请求,后台需要如下配置:
res.setHeader('Access-Control-Allow-Methods','PUT')//access-control-allow-methods:预检请求的应答中明确了客户端所要访问的资源允许使用的方法或方法列表
res.setHeader('Access-Control-Max-Age',)//响应的首部表示预检请求的返回结果可以被缓存多久
//响应首部Access-Control-Allow-Headers:预检请求,列出了将会在正式请求中access-control-headers字段中出现的首部信息 if(req.method==='OPTIONS'){
req.end()
}
app.put('/getData',function(req,res){
console.log(req.headers);
res.end('hello');
})
一个完整的复杂请求的例子,并介绍cors请求的相关字段
let xhr=new XMLHttpRequest()
document.cookie='name=hello'//cookie不能跨域
xhr.withCredentials=true;
//一个boolean类型,指示了是否该使用类似cookies,authorization headers或者TLS客户端证书这一类资格证书来创建一个跨站点访问控制请求。在同一个站点下使用withCredentials属性是无效的
xhr.open('PUT','http://localhost:4000/heoo',true)
xhr.setRequestHeader('name','yuanq')
xhr.onreadystatechange=function(){
if(xhr.readyState===4){
if((xhr.status>=200&&xhr.status<300)||xhr.status===304)
{
console.log(xhr.response);
console.log(xhr.getResponseHeader('name'));
}
}
}
xhr.send()
//server1.js
let express=require('express');
let app=express();
app.use(express.static(_dirname));
app.listen(3000)
let express=require('express');
let app=express();
let whitList=['http://localhost:3000']
//设置白名单
app.use(function(req,res,next){
let origin=req.headers.origin
if(whiteList.includes(origin)){
//设置可以访问的源
res.setHeader('Access-Control-Origin',origin)
//允许携带哪个头访问我
res.setHeader('Access-Control-Headers','name')
//允许哪个方法可以访问我
res.setHeader('Access-Control-Allow-Methods','PUT')
//允许哪个携带cookie
res.setHeader('Access-Control-Allow-Credentials',true)
//预检的存活时间
res.setHeader('Access-Control-Max-Age',6)
//允许返回头
res.setHeader('Access-Control-Expose-Headers','name')
if(req.method==='OPTIONS'){
res.end()
}
}
next()
})
app.put('/getData',function(req,res){
console.log(req.headers);
res.setHeader('name','jeo')
res.end('hello')
})
app.get('/getData',function(req,res){
console.log(req.headers);
res.end('hello')
})
app.use(express.static(_dirname))
app.listen(5000)
3.websocket(支持ie10以上的版本)
websocket是h5的持久化协议,它实现了浏览器与服务器的全双工通信,同时也是解决跨域的一种方案。websocket是一种双向通信协议,在建立连接之后,websocket的server与client都能主动向对方发送或者接受数据,websocket在建立连接时需要借助http协议,连接好之后client与server之间的双向通信与http无关了
原生的websocket api使用不方便,使用socket.io,它可以封装websocket接口,也对不支持websocket的浏览器提供了向下兼容
首先:本地文件index.html向localhost:233发送数据和接受数据
<script>
let socket=new WebSocket('ws://localhost:233');
socket.onopen=function(){
socket.send('hl')
}
socket.onmessage=function(e){
console.log(e.data); } </script>
//服务器端
let express=require('express');
let app=express();
let WebSocket= require('nodejs-websocket')
let wss=new WebSocket.Server({port:})
wss.on('connection',function(ws){
ws.on('message',function(data){
console.log(data);
ws.send('hell')
})
})
 

域名系统DNS以及跨域问题的更多相关文章

  1. MassDNS:跨域DNS枚举工具

    MassDNS:跨域DNS枚举工具 simeon 原文地址:http://offsecbyautomation.com/Use-MassDNS/ 工具地址:https://github.com/ble ...

  2. 跨域之URL

    在介绍怎么跨域之前,先来弄清楚一个概念:URL.以下内容摘自维基百科. 统一资源定位符(或称统一资源定位器/定位地址.URL地址等,英语:Uniform / Universal Resource Lo ...

  3. JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

    一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...

  4. 跨域的jsonP

    1.出现原因:因为web中的同源策略(域名,协议,端口号)限制了跨域访问.   2.区别于json (个人理解)json是数据交换格式,jsonp是数据通信中的交互方式   3.jsonp的get与p ...

  5. JavaScript权威设计--跨域,XMLHttpRequest(简要学习笔记十九)

    1.跨域指的是什么? URL 说明 是否允许通信 http://www.a.com/a.jshttp://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a. ...

  6. JavaScript学习总结(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

    一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...

  7. 关于域名系统DNS解析IP地址的一些总结

    关于域名系统DNS(Domain Name System) 从域名中解析出IP地址. DNS主要由3部分组成: ① 名称解析器(resolver) ② 域名空间(domain name space) ...

  8. Ajax跨域:Jsonp原理解析

    推荐先看下这篇文章:JS跨域(ajax跨域.iframe跨域)解决方法及原理详解(jsonp) JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重 ...

  9. JSONP跨域的原理解析( 一种脚本注入行为)

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制, 被称为“some-Origin Policy”(同源策略).这一策略对于Jav ...

随机推荐

  1. 51nod1220 约数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1220 $G(n)=\sum\limits_{i=1}^n\sum\lim ...

  2. microsoft.jet.oledb.4.0 未注册

    64位系统已经不支持4.0 解决办法 1.下载 ACE2010的驱动,64位的. http://www.microsoft.com/downloads/zh-cn/details.aspx?famil ...

  3. 7.2.4 else与if配对

    规则是,如果没有花括号,else与离它最近的if匹配,除非最近的if被花括号括起来. 注意:要缩进"语句","语句"可以是一条简单语句或复合语句. 记住,编译器 ...

  4. source Insight 添加python 工程

    1. 下载python的识别文件 Python.CLF 2.设置    

  5. linux下安装nexus repository及Intellij Idea集成私有maven

    前段日子公司搞java项目,使用nexus repository搭建了私有maven库,现在把原来的私有nuget也迁到nexus repository上了,下面介绍下搭建流程: https://he ...

  6. Spring获取URL相关信息

    获取请求的URL:request.getRequestURL().toString(); 获取上下文名称(项目名称):request.getContextPath()

  7. 【Python学习】Python3 环境搭建

    参考地址:http://www.runoob.com/python3/python3-install.html Python3 环境搭建 本章节我们将向大家介绍如何在本地搭建 Python3 开发环境 ...

  8. ios监听静音键和音量键事件

    http://blog.csdn.net/slinloss/article/details/7870559

  9. Django:学习笔记

    学习视频:链接:https://pan.baidu.com/s/1KzKUYVLQOlagMfSzq1MEDw      密码:y3qq   Django 版本对应的 Python 版本: Djang ...

  10. ENVI_REGISTER_DOIT( )函数

    Envi_Register_Doit()函数利用控制点为裸数据定义投影坐标.   当将裸数据转为等经纬度投影时(Geographic),控制点pts中的经度值没有负值,0E~180E~360E,西经不 ...