在做项目的时候遇到了跨域的问题…
后端跨域,一般会修改头部信息
看了一下度娘,很多都是filter 设置”Access-Control-Allow-Origin”
然后我就写了个servlet(对方是用ajax[jsonp]调用的),代码如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String origin = request.getHeader("Origin");
response.setHeader("Access-Control-Allow-Origin",origin);
response.setHeader("Access-Control-Allow-Credentials","true");
//do sth
String result = "testResult";
response.getWriter().println(result);
}
果然,对方可以正常调用,但是收不到我发送的数据。。。
百思不得其解之下,我寻求其它的思路,于是便修改代码,如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//get the backcall 获取回调方法
String back = WebUtils.getHTTPRequestParameter(request, "callback");
//do sth
JSONObject json= new JSONObject();
json= (new JSONObject()).put("status", "success");
//发送数据的时候加上 回调方法 格式如: backcall(111)
response.getWriter().println(back+"("+json.toString()+")");
}
附上前端代码
$.ajax({
url:"",//跨域调用的url
dataType:'jsonp',
data:'',
jsonp:'callback',
success:function(result) {
//do sth
}
});
Jsonp原理:
首先在客户端注册一个callback, 然后把callback的名字传给服务器。
此时,服务器先生成 json 数据。
然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp。
最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。
客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里(动态执行回调函数)。