在这个项目中,我们做的充分利用jsonp这是一个特点跨界,完成简单的单点登录认证和权限控制的统一。道,各有各的优点、各有各的优点,选择什么方式实现全然取决于我们自己或者项目经理的开发经验,对各种框架的理解程度往往决定了眼下开发项目的总体架构。

这不是一项凭空产生的新东西。不过JS的一个特性而已之前没有被我们提及也没有被我们注意到原来常常使用的js还能够跨域呢,觉的我们对已经学过的东西理解还不是不够深入、有些肤浅,JS绝大多数在浏览器中执行完毕各种动态效果,开发js的人一開始应该就考虑到了浏览器的特性。为了不受浏览器的限制而将js赋予了这一个神圣的职责,浏览器的限制是安全策略里面的一个策略,叫同源策略。

同源策略

同源的意思是协议、域名、port都同样,仅仅要有一个不同样那么就是不同源的訪问地址。一个浏览器的一个页面中是不能够从不同源的地址获取数据的,当每次页面载入时浏览器都会自己主动推断获取的数据是否来自一个源地址。假设不是会受到浏览器的阻止。

好像会议的安检一样,仅仅同意某一类有通行证的人进入,其它的则不会让进入阻止在外面,而js有一个特性能够跨过安检通过特殊途径进入不受阻止。

解决同源策略问题jsonp

      Jsonp(JSON with Padding)是资料格式 json 的一种“使用模式”,能够让网页从别的网域获取资料。

之所以叫jsonp能够理解为主要作用和目的就是从别的网域获取json格式数据,这是它的主要应用方面,其他的作用临时没实用到。

原理

原理也非常easy理解,它之所以能够跨域是利用了script标签的跨域能力。试想?你有没有想过常常引入的一个普通js文件。它是怎么样载入到页面中去的为什么它的src属性写上一个地址就能够把别处的js文件载入到页面上呢。经測试这个src属性能够填写随意有效的地址。即使不在同一个项目文件夹结构中的文件也是能够的。

比如这个链接;

<span style="font-size:14px;"><script type="text/javascript" src="_js/jquery-2.0.0.min.js"></script></span>

它仅仅是一个引用,载入进来的文件时非常多这种函数function(){}………………,同理jsonp就是这样一种模式。它返回的也是js函数同上面这个链接没有什么差别。仅仅是函数名叫做回调函数需预定义好,函数里面是返回的json数据。我们来看一个实例:

<span style="font-size:14px;">	<script type="text/javascript">

		function getjson(json)
{
alert("通过src属性获得json="+json.result);
}
</script> <script type="text/javascript" src="http://localhost:28080/application1/login.do? method=loginInterface&callback=getjson&name=lilongsheng"></script></span>

这是我自己写的一个js标签。它的src地址是还有一个tomcat中部署的application1应用的登录接口地址。而上面调用是在还有一个tomcat中的application2 jsp页面,属于不同源调用,再来看一下application1中接口类

<span style="font-size:14px;">    public ActionForward loginInterface(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{ /** 推断是否登录成功 */
boolean isLogin = false;
//从用URL中获取username和password
String name=request.getParameter("name");
String pwd=request.getParameter("pwd");
try {
//回调函数名
String callbackFunName = request.getParameter("callback");
//利用jsonp包装的json数据
String data = callbackFunName + "({\"result\":\"" + name + "\"})"; System.out.println(data);
//返回到界面
print(data,request,response); } catch (Exception e) {
e.printStackTrace();
}
return null;
}</span>

返回结果为gejson({"result":"lilongsheng"}),返回的是一个JS代码,它会自己主动运行getjson这个函数。而花括号{}里面的内容正好当做參数传递到这个函数里面,完毕跨域调用。

从上面能够看出通过script标签能够从不同源的地方获得json数据。

我们再来看看jquery是怎样使用的,只在方法中增加一个參数就能够实现,感觉简单了非常多,这是由于框架已经为我们封装好了里面的一些细节调用关系。只要我们设置了參数它就支持跨域訪问,调用例如以下:

<span style="font-size:14px;">		function getJsonp()
{
var name=$("#name").val();
var pwd=$("#pwd").val();
$.ajax({
url:"http://localhost:28080/application1/login.do?method=loginInterface&name="+name+"&pwd="+pwd,
type:"post",
dataType:"jsonp",
jsonp : 'callback',
success:function(data){
alert(data.result);
},
error:function(){
alert("网络连接失败! ");
}
});
}</span>

除了jquery之外还有ext等框架都支持这一特性,它们都是基于javaScript基础类库封装起来的,因此都具有js具有的特性。

关于jsonp的怎样应用已经录了一集视频,以下是下载地址

jsonp视频演示下载地址:http://pan.baidu.com/s/1dDIjnTR

版权声明:本文博客原创文章。博客,未经同意,不得转载。

深入了解jsonp解决跨域访问的更多相关文章

  1. jsonp实现跨域访问

    要实现JSONP跨域访问,首先就要了解什么是跨域?然后JSONP与JSON的关系? 1.什么是跨域? 跨域简单的说就是一个域名下的程序和另一个域名下的程序做数据交互.比如说:现有一个http://ww ...

  2. AJAX跨域问题解决方法(2)——JSONP解决跨域

    JSONP是什么?JSON全称为JSON with Padding,是JSON的一种补充的使用方式,不是官方协议. 使用JSONP服务器后台要改动吗?JSONP不同于一般的ajax请求返回json对象 ...

  3. springboot 前后端分离开发解决跨域访问

    最近新学习了Java EE开发框架springboot,我在使用springboot前后台分离开发的过程中遇到了跨域求问题.在网上寻找答案的过程中发现网上的解决方案大多比较零散,我在这里整理一个解决方 ...

  4. 用jQuery与JSONP轻松解决跨域访问的问题【转】

    原文地址:http://www.jb51.net/article/46463.htm 好在,有jquery帮忙,跨域问题似乎没那么难缠了.这次也借此机会对跨域问题来给刨根问底,结合实际的开发项目,查阅 ...

  5. 用jQuery与JSONP轻松解决跨域访问的问题

    浏览器端的真正跨域访问,推荐的是目前jQuery $.ajax()支持get方式的跨域,这其实是采用jsonp的方式来完成的. var qsData = {'searchWord':$("# ...

  6. C# 和Jsonp的一个小demo 用jQuery与JSONP轻松解决跨域访问的问题

    客服端:      在A项目下面 建立一个 JsonpClient.aspx页面,代码如下: <%@ Page Language="C#" AutoEventWireup=& ...

  7. JSONP解决跨域问题,什么是JSONP(转)

    原文链接:https://www.cnblogs.com/xinxingyu/p/6075881.html 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的 ...

  8. 什么是jsonp?——使用jsonp解决跨域请求问题

    我们在使用ajax请求的时候经常会产生跨域问题,这是由于浏览器的同源策略导致的.所谓同源,即域名.协议.端口均相同,否则不管是静态页面还是动态网页或者web服务都无法通过ajax正常请求.有时候,我们 ...

  9. jsonp 解决跨域传输

    JSONP是JSON with Padding的略称.它是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅 ...

随机推荐

  1. 手把手教你如何加入到github的开源世界! (转)

    我曾经一直想加入到开源项目中,但是因为没有人指导流程,网上看了很多,基本都是说了个大概,如果你也是一个初出茅庐的人,那么,我将以自己提交的一次开源代码为例,教会你步入开源的世界. 1,首先登陆到htt ...

  2. JQuery之初探

    软考过后又进入了紧张的B/S学习阶段,因为自己的进度比較慢,所以更要加进学习.如今就来总结下JQuery的一些基础知识: JQuery定义 jQuery是一套跨浏览器的JavaScript库,简化HT ...

  3. NSOJ 畅通工程(并查集)

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...

  4. Android第一次打开应用程序,实现向导界面

    转载请注明出处,谢谢http://blog.csdn.net/harryweasley/article/details/42079167 先说下思路:1.利用Preference存储数据,来记录是否是 ...

  5. Prototype and Constructor in JavaScript

    The concept of prototype in JavaScript is very confusing, especially to those who come with a C++/JA ...

  6. 读取上传的CSV为DataTable

    csv导入文件会把每列的数据用英文逗号分割开来,如果遇到某列中包含英文逗号,则会把该列用英文双引号进行包装. 如果csv文件中某列的数据本身包含英文逗号,应该使用读取字符串的方式进行解析数据,如csv ...

  7. error C3130: 内部编译器错误: 未能将插入的代码块写入PDB

    近期编译cocos2d-x的test突然出现这个错误,又一次编译也无法解决. 一般出现这个错误是两个原因:一个是磁盘空间不足,还有一个是项目太大导致pdb文件太大,无法继续写入. 原本cocos2d- ...

  8. Matlab splinetx

    function v = splinetx(x,y,u) %SPLINETX Textbook spline function. % v = splinetx(x,y,u) finds the pie ...

  9. Shuttle ESB

    Shuttle ESB(六)——在项目中的应用 如果说你认真看了前面几篇关于ESB的介绍,我相信,在这一篇文章中,你将会找到很多共鸣. 尽管,市面上开源的ESB确实非常之多,像Java中的Mule E ...

  10. C控制语句--分支和跳转

    /*C控制语句--分支和跳转*/ /*关键字 if else switch continue break case default goto 运算符:&&(且) ||(或) ?:(三元 ...