Java跨域问题的处理详解

摘要:
1.出于安全考虑,JavaScript不允许页面跨域调用其他页面的对象。那就有问题了。什么是跨域问题?URL指示是否允许通信http://www.a.com/a.jshttp://www.a.com/b.js允许使用相同的域名http://www.a.com/a.jshttp://www.b.com/a.js不允许使用不同的域名http://www.a.com:8000/a.jshttp://www.a.com/b.js不允许使用相同域名的不同端口https://www.a.com/a.jshttp://www.a.com/b.js同一域名不允许使用不同的协议。3.JAVA中通常有两种常见的跨域问题解决方案。JSON是一种数据交换格式,而JSONP是一种非官方的跨域数据交换协议。

1,JavaScript由于安全性方面的考虑,不允许页面跨域调用其他页面的对象,那么问题来了,什么是跨域问题?

答:这是由于浏览器同源策略的限制,现在所有支持JavaScript的浏览器都使用了这个策略。那么什么是同源呢?所谓的同源是指三个方面“相同”:
1,域名相同
2,协议相同
3,端口相同

2,下面就举几个例子来帮助更好的理解同源策略。
URL 说明 是否允许通信

 http://www.a.com/a.js
 http://www.a.com/b.js 同一域名 允许

 http://www.a.com/a.js 
 http://www.b.com/a.js  不同域名    不允许

 http://www.a.com:8000/a.js
 http://www.a.com/b.js  同一域名不同端口    不允许

 https://www.a.com/a.js 
 http://www.a.com/b.js  同一域名不同协议    不允许

3,在JAVA中处理跨域问题,通常有以下两种常用的解决方法。
1,第一种解决方法
后台代码在被请求的Servlet中添加Header设置:

response.setHeader("Access-Control-Allow-Origin", "*");
PrintWriter out =null;
try
{
out = response.getWriter();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
out.print("{'status':'ok'}");
out.flush();
out.close();

Access-Control-Allow-Origin这个Header在W3C标准里用来检查该跨域请求是否可以被通过,如果值为*则表明当前页面可以跨域访问。默认的情况下是不允许的。

在前端JS中需要向Servlet发出请求,请求代码如下所示:

    $.ajax({
              url: "your url",
              type:"get or post",
              dataType:"json",
              data:{
                          ....
              },
              success:function(data){
                             ...
             }

第二种解决方法
通过jsonp跨域请求的方式。JSONP和JSON虽然只有一个字母的区别,但是他们完全就是两回事,很多人很容易把他们搞混。JSON是一种数据交换的格式,而JSONP则是一种非官方跨域数据交互协议。
首先来说一下前端JS是怎么发送请求。代码如下所示:

 $.ajax({
           url:"your url",
           type:"get or post",
           async:false,
           dataType : "jsonp",
           //服务端用于接收callback调用的function名的参数
           jsonp:"callbackparam",
           //callback的function名称
           jsonpCallback:"success_jsonpCallback",
           success:function(data){
                    console.log(data);
           },
           error:function(data){
                    console.log(data);
           }
 });

这里的callbackparam和success_jsonpCallback可以理解为发送的data数据的键值对,可以自定义,但是callbackparam需要和后台约定好参数名称,因为后台需要获取到这个参数里面的值(即success_jsonpCallback)。

4,下面,最重要的来了,后台怎么样获取和返回数据呢。代码如下所示:

PrintWriter out =null;
String callback=req.getParameter("callbackparam");
String json=callback+"({'status':'ok'})";
try
{
out = resp.getWriter();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
out.print(json);
out.flush();
out.close();

首先需要获取参数名为callbackparam的值,这里获取到的值就是“success_jsonpCallback”。然后将这个值加上一对小括号。小括号里放入你需要返回的数据内容,比如这里我返回一个JSON对象。当然你也可以返回其他对象,比如只返回一个字符串类型数据也可以。最后前端JS返回的数据就是这样的:

success_jsonpCallback({'status':'ok'})

浏览器会自动解析为json对象,这时候你只需要在success回调函数中直接用data.status就可以了。

免责声明:文章转载自《Java跨域问题的处理详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mongodb进阶一之高级查询webp图片实践之路下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

下载 CentOS 7 镜像文件

简单地说,CentOS建议您使用CentOS的最新版本。在撰写本文时,CentOS的最新版本是7.6。在CentOS 7的新版本发布后,/7/ios/x86_64以下的图像文件自然会成为最新版本。CentOSVault的标题有一段英文,这主要意味着CentOSVault不提供CentOS图像文件下载。建议阅读页脚中提供的链接。以从CentOSVault的美国...

前端项目里常见的十种报错及其解决办法

错误6:未标记引用错误:$isnotdefinedUncaughtReferenceError:$isnotfinedUnaughtReferenceError,如果将其更改为jsp页面,则无法找到路径。此时,它变成了一个幻影。png格式。此时,您只需将以下代码添加到文件:Picture。png解决方案:在和˂Base href=“”˃错误8:未捕获类型错误...

CommonJS规范

NodeJS是本规范的实现。环境、运行、JSGILocaland远程包和包管理关于每个子规范的具体定制进度,请参考官方网站描述:Apache CouchDB和node.js。然而,这些项目中的大多数只实现了CommonJS的一些规范。具体项目及实施请参见官方网站描述:http:...

Foxyproxy 火狐代理插件

Firefox上的插件Autoproxy一直很难使用。它永远不能更新规则,但foxyproxy可以替代它。用鼠标中键单击foxyproxy图标以在不同的代理方法之间切换。foxyproxy图标从foxhead变为蓝色,因为内容传输发生在网页中,该传输通过默认代理服务器,默认代理的初始颜色为蓝色。...

Oracle11g温习-第七章:redo日志

thread:线程,在单实例的环境下,thread#永远是1sequence:日志序列号。在日志切换时会递增。FIRST_CHANGE#:在当前日志中记录的首个数据块的scn。...

Sublime Text3注册激活和部分配置

此时,我们可以输入要安装的插件包ConvertToUTF85。设置中文对齐方式、字体等//设置默认代码“default_encoding”:“UTF-8”,//显示代码“show_encoding”:true,//显示行号“show_line_endings”:true,//设置字号“font_size”:14,//设置字体对齐方式“font_options...