jsonp突破同源策略,实现跨域访问请求
跨域访问问题,相信大家都有遇到过。这是一个很棘手的问题。不过道高一尺,魔高一丈,对于这类问题,总有解决问题的方案。最近我又接触到了这个问题,解决的途径是ajax+jsonp。
说到这个问题,不得不说一下“同源策略(Same-Origin Policy)”,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源,就是必须协议、域名、端口都一致的,才叫做同源。例如:http://www.12306.cn和https://www.12306.cn,由于协议不一致,就不是同源。http://127.0.0.1:8080/test1和http://localhost:8080/test1 也不属于同源,因为域名不一致。端口不同当然也不叫同源了。
如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。这是一个令web开发人员非常手疼的问题。比如,我现在打开百度网页,然后在控制台中请求CSDN的网页,那么就会报如图所示的异常:
在上图中,大家可能会看到这个词儿——“Access-Control-Allow-Origin”,它是W3C标准中为了解决同源策略引起的跨域问题而提出的一种技术——“跨域资源共享(CORS,Cross-Origin Resource Sharing)”。只要你在服务端设定这个Access-Control-Allow-Origin的header就可以允许跨域访问了。有兴趣的话,自己查一下,很简单。不过它有安全隐患,主要是因为支持通配符*。每个网站都可以随意请求,那就太不安全了。如:
- response.setHeader("Access-Control-Allow-Origin", "*");
Query中$.ajax的get方法,是支持跨域访问的,不过dataType要设定为“jsonp”。Jsonp(JSON with Padding)是 json 的一种“使用模式”,可以让网页从别的网域获取资料。jsonp是采用的js的回调机制来实现的。使用方式也很简单,代码如下:
- $.ajax({
- url: 'http://localhost:8080/test2/searchJSONResult.action',
- type: "GET",
- dataType: 'jsonp',
- data: {name:”ZhangHuihua”}, timeout: 5000,
- success: function (json) {
- //客户端jquery预先定义好的callback函数,成功获取跨域服务器上的json数据后,会动态执行这个callback函数
- alert(json);
- },
- error: function (){
- alert("请求失败!");
- }
- });
- //简单方式如下:
- $.getJSON("http://localhost:8080/test2/searchJSONResult.action?name1=ZhangHuihua&callback=?",
- function(json){ // 执行代码
- });
在服务器端,重新拼接json数据:
- /** 获取请求的各个参数(用户名等) **/
- Map map = request.getParameterMap();
- /** 获取jsonp的回调函数名 **/
- String callback = request.getParameter("callback");
- /** 调用业务逻辑,并将结果转化为json格式 **/
- String msg = convert2Json(services.login(map))
- /** 重新拼接格式,并输出 **/
- out.println(callback + "('" + msg + "')");
这样就可以在浏览器获取到异源服务端返回的json数据了。这里返回的跟json格式不一样,它的格式是回调函数名+(json数组)。其中小括号不可以省略。否则请求是发送成功了,但是却获取不到数据,因为返回的数据格式出错了。效果图如下:
jsonp突破同源策略,实现跨域访问请求的更多相关文章
- JS同源策略和跨域访问
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只 ...
- 1.7 xss之同源策略与跨域访问
同源策略: 同源策略 在web应用的安全模型中是一个重要概念.在这个策略下,web浏览器允许第一个页面的脚本访问第二个页面里的数据,但是也只有在两个页面有相同的源时.源是由URI,主机名,端口号组合而 ...
- cors跨域和jsonp劫持漏洞 和 同源策略和跨域请求解决方案
cors跨域和jsonp劫持漏洞: https://www.toutiao.com/a6759064986984645127/ 同源策略和跨域请求解决方案:https://www.jianshu.co ...
- 第二百七十四节,同源策略和跨域Ajax
同源策略和跨域Ajax 什么是同源策略 尽管浏览器的安全措施多种多样,但是要想黑掉一个Web应用,只要在浏览器的多种安全措施中找到某种措施的一个漏洞或者绕过一种安全措施的方法即可.浏览器的各种保安措 ...
- JS同源策略和跨域问题
同源策略和跨域问题:http://www.cnblogs.com/chaoyuehedy/p/5556557.html 深入浅出JSONP--解决ajax跨域问题:http://www.cnblogs ...
- 11. cookie_session_原生ajax_readyState的值_同源策略_跨域_jsonp的使用
1. cookie 浏览器存储技术.(服务器将少量数据交于浏览器存储管理) 作用: 存储数据, 解决 http 协议无状态问题 工作流程: 浏览器发送请求给服务器,请求登录 服务器返回响应给浏览器,此 ...
- Ajax_同源策略以及跨域问题
Ajax_同源策略 同源策略是浏览器的一种安全策略, 同源指的是:协议.域名.端口.必须完全相同. 违背同源策略就是跨域. 而AJAX是默认遵循同源策略的: 同源说通俗一点呢就是页面跟获取请求的接口是 ...
- 同源策略、跨域、json和jsonp
同源策略 源(origin)就是协议.域名和端口号.若地址里面的协议.域名和端口号均相同则属于同源. 以下是相对于 http://www.a.com/test/index.html 的同源检测 • h ...
- XSS中的同源策略和跨域问题
转自 https://www.cnblogs.com/chaoyuehedy/p/5556557.html 1 同源策略 所谓同源策略,指的是浏览器对不同源的脚本或者文本的访问方式进行的限制.比如源a ...
随机推荐
- java判断不为空
因为java是强类型语言,所以判断空的时候分null 和字符串空 if(userID == null || "".equals(userID)){ response.sendRed ...
- android studio主题设置-笔记3
主题背景设置(就是工具黑色背景还是白色背景),路径:File-Settings-Appearance
- form表单中的label标签
小伙伴们,你们在前面学习表单各种控件的时候,有没有发现一个标签--label,这一小节就来揭晓它的作用. label标签不会向用户呈现任何特殊效果,它的作用是为鼠标用户改进了可用性.如果你在 labe ...
- Swift - 31 - 常量参数, 变量参数和inout参数
//: Playground - noun: a place where people can play import UIKit // swift中默认情况下, 传入的参数是不可以修改的, 也就是l ...
- MySQL DELETE
MySQL DELETE 语句 你可以使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录. 你可以在mysql>命令提示符或PHP脚本中执行该命令. 语法 以下是S ...
- 如何遍历json属性和动态添加属性
var person= { name: 'zhangsan', pass: '123' , 'sni.ni' : 'sss', hello:function (){ for(var i=0;i< ...
- grails框架中读取txt文件内容将内容转换为json格式,出现异常Exception in thread "main" org.json.JSONException: A JSONObject text must begin with '{' at character 1 of [...]
Exception in thread "main" org.json.JSONException: A JSONObject text must begin with '{' a ...
- scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)
scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...
- 栈的顺序存储方式的C语言实现
/* 编译器:Dev-c++ 5.4.0 文件名:stack.cpp 代码版本号:1.0 时间:2015-10-10 20:08:54 */ #include <stdio.h> #inc ...
- 关于几种常用的Adapter使用区别
Adapter常用的实现类如下: 1.ArrayAdapter:简单.易用的Adapter,通常用于将数组或List集合的多个值包装成多个列表项. 2.SimpleAdapter:并不简单.功能强大的 ...