jsonp跨域原理,使用以及同源策略

什么是跨域请求,为什么用跨域

浏览器从一个域名的网页去请求另一个域名的资源时,域名,端口,协议任何一个不同,都算是跨域请求

域名是一个网站的唯一标识,一个域名代表着一个网站以及其对应的服务
服务间调用可以使用基于soa思想的rpc调用,也可以是webservice等等
那么从前端页面发起的调用,就会用到跨域

说跨域就必须先说浏览器的同源策略(SOP(same origin policy)),同源指域名,端口,协议同时相同.
同源策略就是为了保护浏览器免受XSS、CSFR等攻击,
但有时候又需要浏览器进行调用,域名不同最为常见,那么就需要用到跨域

跨域的几种解决方案

1、 通过jsonp跨域(JSON with Padding)
2、 document.domain + iframe跨域
3、 location.hash + iframe
4、 window.name + iframe跨域
5、 postMessage跨域
6、 跨域资源共享(CORS)
7、 nginx代理跨域
8、 nodejs中间件代理跨域
9、 WebSocket协议跨域

jsonp原理


JSONP的最基本的原理是:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。
这样说来,这种跨域方式其实与ajax XmlHttpRequest协议无关了。这样其实"jQuery AJAX跨域问题"就成了个伪命题,jquery $.ajax方法名有误导人之嫌。如果设为dataType: 'jsonp',这个$.ajax方法就和ajax XmlHttpRequest没什么关系了,取而代之的则是JSONP协议。
JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问。JSONP即JSON with Padding。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。
如果要进行跨域请求, 我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。
这种跨域的通讯方式称为JSONP。jsonCallback 函数jsonp1236827957501(....):是浏览器客户端注册的,获取跨域服务器上的json数据后,回调的函数Jsonp的执行过程如下:一.首先在客户端注册一个callback (如:'jsoncallback'), 然后把callback的名字(如:jsonp1236827957501)传给服务器。
注意:服务端得到callback的数值后,要用jsonp1236827957501(......)把将要输出的json内容包括起来,
此时,服务器生成 json 数据才能被客户端正确接收。二.然后以 javascript 语法的方式,生成一个function, 
function 名字就是传递上来的参数 'jsoncallback'的值 jsonp1236827957501 .三.最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时javascript文档数据,作为参数, 
传入到了客户端预先定义好的 callback 函数(如上例中jquery $.ajax()方法封装的的success: function (json))里。可以说jsonp的方式原理上和<script src="http://跨域/...xx.js"></script>是一致的
(qq空间就是大量采用这种方式来实现跨域数据交换的)。
JSONP是一种脚本注入(Script Injection)行为,所以有一定的安全隐患。

jsonp优缺点

优点:不受同源策略限制;兼容性好(旧版本浏览器也适用);callback回调机制回传结果
缺点:只支持get方式的http请求,有安全隐患(本质是脚本注入)

jsonp的使用(Js/JQuery+SpringMVC)

原生js写法:

假设这个域名是www.aa.com
<script>var script = document.createElement('script');script.type = 'text/javascript';// 传参并指定回调执行函数为onBackscript.src = 'http://www.bb.com:8080/login?user=admin&callback=onBack';document.head.appendChild(script);// 回调执行函数function onBack(res) {alert(JSON.stringify(res));}</script>

jquery写法:

需要注意的是,jquery虽然是以ajax的方式写的jsonp,但我们一定要清楚,jsonp和ajax没有关系,ajax是严格遵守同源策略的,只不过是jquery封装的时候复用了ajax的格式而已
jQuery.ajax({type: "get",async: false,url: "http://www.bb.com:8080/login?user=admin",dataType: "jsonp",jsonpCallback: "onBack",  //指定回调函数名称,不写的话也行,会有个随机的success: function(result){}
});    

后台controller:

@Controller
public class TestController {@RequestMapping("login")public void login(HttpServletResponse response, HttpServletRequest request){Map<String, Map<String, String>> res = null;try {//清除浏览器缓存(习惯写)response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "no-cache");response.setHeader("Cache-Control", "no-store");response.setDateHeader("Expires", 0);response.setCharacterEncoding("UTF-8");//必须写,这个要回传回去String callback = request.getParameter("callback");//这个是简单的防xss漏洞方法callback = replaceInvaidStr(callback);//获得get请求的参数String user= request.getParameter("user");//调用service服务,获得requestUser user = xxxService.getUser(user);//拼接jsonp格式的返回值String output = callback + "(" + JsonUtil.toJSONString(res) + ")";//response输出writeHtml(response,output);} catch (Exception e) {//异常处理}}/*** response输出*/private void writeHtml(HttpServletResponse response, String html) {response.setContentType("application/json;charset=UTF-8");PrintWriter pw = null;try {pw = response.getWriter();pw.write(html);pw.flush();pw.close();} catch (Exception e) {logger.error("StockController writeHtml 写json失败..." + e);if (pw != null) {pw.close();}}/*** 防xss漏洞用* @param str* @return*/public String replaceInvaidStr(String str){if(str!=null){str=str.replace('|',' ');str=str.replace('#',' ');str=str.replace('$',' ');str=str.replace('%',' ');str=str.replace('@',' ');str=str.replace('\'',' ');str=str.replace('\"',' ');str=str.replace('<',' ');str=str.replace('>',' ');str=str.replace('@',' ');str=str.replace('\\',' ');str=str.replace('+',' ');return str;}return "";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LESS语言简介

一、概述 LESS是一种 动态 样式 语言. LESS 将 CSS 赋予了动态语言的特性&#xff0c;如 变量&#xff0c; 继承&#xff0c; 运算&#xff0c; 函数. LESS 既可以在 客户端 上运行 (支持IE 6, Webkit, Firefox)&#xff0c;也可以借助Node.js或者Rhino在服务端运行。 LE…

非对称加密算法之RSA算法实现

对称加密&#xff0c;非对称加密&#xff0c;公钥&#xff0c;私钥&#xff0c;RSA这些常常听到的&#xff0c;到底是怎么回事 有个同事问我公钥私钥到底为什么能互相解开&#xff0c;一时语塞&#xff0c;平时都只是知道怎么用&#xff0c;但很少去了解的更细&#xff0c;现在…

流式计算storm核心组件介绍以及入门案例---跟着就能在本地跑起来的storm项目

关于storm的基础,参照我这篇文章:流式计算storm 关于并发和并行,参照我这篇文章:并发和并行 关于storm的并行度解释,参照我这篇文章:storm的并行度解释 关于storm的流分组策略,参照我这篇文章:storm的流分组策略 关于storm的消息可靠机制,参照我这篇文章:storm的消息可靠机制 …

javascript中的this讲解

查看this指向的一句话法则&#xff1a;永远指向其所在函数的所有者如果没有所有者时&#xff0c;指向window。理解this的要点&#xff1a;关键在于将函数与函数名分开看待。同一个函数&#xff0c;在不同的执行方法下&#xff0c;会有不同的效果。如何来进行理解呢&#xff0c;…

HTTP首部---referrer 知识点

Referrer介绍 Referrer网站来路&#xff1b;访问者进入网站任何途径。HTTP Referer是header的一部分&#xff0c;当浏览器向web服务器发出请求的时候&#xff0c;一般会带上Referer,告诉服务器用户从那个页面连接过来的&#xff0c;服务器藉此可以获得一些信息用语处理。 获取…

JavaScript自执行匿名函数

格式&#xff1a;&#xff08;function(){//代码})();解释&#xff1a;这是相当优雅的代码&#xff08;如果你首次看见可能会一头雾水&#xff1a;&#xff09;&#xff09;&#xff0c;包围函数&#xff08;function(){})的第一对括号向脚本返回未命名的函数&#xff0c;随后一…

nginx使用gzip压缩文件---lz77算法---Haffman编码

为了提高页面的响应速度,可以从设置 nginx 的 gzip 和缓存这2方面入手,而为ttf,js,css等文件开启 gzip 和缓存能大大减少带宽的消耗. HTTP 的内容编码机制 Accept-Encoding 和 Content-Encoding 是 HTTP 中用来对[采用何种编码格式传输正文]进行协定的一对头部字段. 它的工作…

Javascript模块化编程

随着网站逐渐变成"互联网应用程序"&#xff0c;嵌入网页的Javascript代码越来越庞大&#xff0c;越来越复杂。 网页越来越像桌面程序&#xff0c;需要一个团队分工协作、进度管理、单元测试等等......开发者不得不使用软件工程的方法&#xff0c;管理网页的业务逻辑。…

zookeeper基础整理

zookeeper简述 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件 ZooKeeper 使用 Java 所编写&#xff0c;但是支持 Java 和 C 两种编程语言。 提供的功能包括&#xf…

JS模块化编程require.js简介

一、为什么要用require.js&#xff1f; 最早的时候&#xff0c;所有Javascript代码都写在一个文件里面&#xff0c;只要加载这一个文件就够了。后来&#xff0c;代码越来越多&#xff0c;一个文件不够了&#xff0c;必须分成多个文件&#xff0c;依次加载。下面的网页代码&…

CSS position属性

目前几乎所有主流的浏览器都支持position属性&#xff08;"inherit"除外&#xff0c;"inherit"不支持所有包括IE8和之前版本IE浏览器&#xff0c;IE9、IE10还没测试过&#xff09;&#xff0c;以下是w3school对position五个值的解释&#xff1a; 其中absol…

storm的并行度的解释--- ( 看完就能理解 )

关于storm的基础,参照我这篇文章:流式计算storm 关于并发和并行,参照我这篇文章:并发和并行 关于storm的并行度解释,参照我这篇文章:storm的并行度解释 关于storm的流分组策略,参照我这篇文章:storm的流分组策略 关于storm的消息可靠机制,参照我这篇文章:storm的消息可靠机…

jQuery选择器总结

jQuery 的选择器可谓之强大无比&#xff0c;这里简单地总结一下常用的元素查找方法 最基本的&#xff1a; $("#myELement") 选择id值等于myElement的元素&#xff0c;id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("div") …

storm的流分组策略

关于storm的基础,参照我这篇文章:流式计算storm 关于并发和并行,参照我这篇文章:并发和并行 关于storm的并行度解释,参照我这篇文章:storm的并行度解释 关于storm的流分组策略,参照我这篇文章:storm的流分组策略 关于storm的消息可靠机制,参照我这篇文章:storm的消息可靠机…

CSS串联和后代选择器

串联选择器&#xff1a;作用在同一个标签上复制代码代码如下:<div class”a” id "qq"><span>look at the color</span></div></p> <p>css: #qq.a{….}后代选择器&#xff1a;作用在不同标签上复制代码代码如下:<div id &quo…

storm消息可靠机制(ack)的原理和使用

关于storm的基础,参照我这篇文章:流式计算storm 关于并发和并行,参照我这篇文章:并发和并行 关于storm的并行度解释,参照我这篇文章:storm的并行度解释 关于storm的流分组策略,参照我这篇文章:storm的流分组策略 关于storm的消息可靠机制,参照我这篇文章:storm的消息可靠机…

JS--Console.log()详解

对于JavaScript程序的调试&#xff0c;相比于alert()&#xff0c;使用console.log()是一种更好的方式&#xff0c;原因在于&#xff1a;alert()函数会阻断JavaScript程序的执行&#xff0c;从而造成副作用&#xff1b;而console.log()仅在控制台中打印相关信息&#xff0c;因此…

订单单量监控v2

前段时间做了一个订单单量监控的项目,已经投入使用了,现在总结一下 前期的想法参考这篇文章 整体使用了storm实时计算框架和redis数据库,还有kafka消息队列 先上效果图,我们可以后期将数据展示出来,明显发现某天00点有单量突变的情况,明显是促销活动导致单量增加了 而后面的报…

AFNetworking 3.0迁移指南

AFNetworking是一款在OS X和iOS下都令人喜爱的网络库。为了迎合iOS新版本的升级, AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持。如果你的项目以前使用过这些API&#xff0c;建议您立即升级到基于 NSURLSession 的API的AFNetworking的版本。本指南将引导您…

想法记录---实时计算的TopN的实现

TopN就是找出时间段内出现频率最高的n个 TopN的计算是个老生常谈的话题,比如微博的热搜,都是隔段时间就统计一次TopN 现在想做一个实时计算的TopN. 先说说离线计算的TopN,再说实时TopN 离线TopN 离线TopN一般出现在大数据的应用场景,使用hadoop的map reduce,网上有很多案例 …