版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/qq_27512271/article/details/84673163
1、概要:
ajax请求是非常容易而且方便的,但是有时候我们会遇到一个跨域的问题,那就是Ajax请求的url不是本地或者同一个服务器下面的URI,最后导致虽然请求200,但是不会返回任何数据,事实上简单来说请求同一个域名下的url或者说用不带http的绝对路径和相对路径请求是没有任何问题的,如果请求外部资源,那么这就称为跨域请求。
跨域问题的来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。跨域问题是针对JS或jquery中的ajax,html本身没有跨域问题。
ajax跨域请求与普通请求处理差别较大,下面我们就详细的介绍一下。
2、发送请求端处理方法:
ajax实现跨域常用的方式是用JSONP跨域,JSONP是JSON with Padding的略称。它是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。
$.ajax({
type:"get", //请求方式,跨域请求方式必须get方式。
async:false, //是否异步,一般设置为false即为同步。
url:"跨域请求路径",
dataType:"jsonp", //跨域json请求一定是jsonp
jsonp: "callbackparam", //跨域请求的参数名,默认是callback
//jsonpCallback:"successCallback", //自定义跨域参数值,回调函数名也是一样,默认为jQuery自动生成的字符串
data:{"querys":"querydata"}, //请求参数
beforeSend: function() {
//请求前的处理
},
success: function(data) {
//请求成功处理,和本地回调完全一样
},
complete: function() {
//请求完成的处理
},
error: function() {
//请求出错处理
}
});
3、接收请求端处理方法:
本文接收请求端处理方法的实例是在Java springmvc中的,其他的也是类似的处理方式,本文就不在一一举例了。
@RequestMapping(params = "dJsonp")
@ResponseBody
public String dJsonp(HttpServletRequest request,HttpServletResponse response,String callback) {
String dJson="";
response.setHeader("Access-Control-Allow-Origin","*");/**设置响应头允许ajax跨域访问**/
response.setHeader("Access-Control-Allow-Methods","GET,POST");/*星号表示所有的异域请求都可以接受,*/
response.setCharacterEncoding("UTF-8");//设定编码
response.setContentType("application/json");//表示是json类型的数据
String querys=request.getParameter("querys");
/**
此处是请求处理操作
*/
dJson=callback+"({\"bool\":\"true\",\"state\":\"0\"})";
PrintWriter out= response.getWriter();
out.print(dJson);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}