代理post跨域请求
来源:互联网 发布:国家数据统计数据库 编辑:程序博客网 时间:2024/05/21 14:16
最近在一个项目中,需要访问到外部的资源,而jquery无法满足要求,虽然可以使用jsonp的方法,但我要访问的那个只能用post方法,网上一顿搜索后给出了一系列的方案。
【解决方案】
1、CORS
概述:Cross-Origin Resource Sharing,W3C制定的跨站资源分享标准。post前会产生一次options嗅探(称之为preflight,但简单请求不会出现)来确认有否跨域请求的权限;客户端post时会带上Origin头指示来源网站,服务端响应时需带上Access-Control-Allow-Origin头与Origin头的值匹配,以示许可。ie8提供了封装好的XDomainRequest对象,部分实现了该标准;而其它浏览器则提供了XMLHttpRequest(Level 2)对象。
要求:ie8(XDomainRequest)/ie10/safari4/GC/FF3.5
参考:cross-site xmlhttprequest with CORS
参考:https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS
参考(中文):http://www.zfkun.com/394.html (simple reuest的定义描述不完整)
优点:W3C标准方案
缺点:不兼容老浏览器,移动浏览器尚未支持。 桌面和移动浏览器兼容性
注意:若在多个iframe之间跨域通信,优先考虑 window.postMessage
2、invisible iframe
概述:通过js动态生成不可见表单和iframe,将表单的target设为iframe的name以此通过iframe做post提交。提交后由于跨域,无法直接读取响应内容。一般的做法是,iframe内通过js改变自身location的fragment,外部则监听iframe的onload事件,读取fragment的内容。有现成的跨域iframe通信类库,如jQuery PostMessage Plugin。
要求:ie6/safari/GC/FF4
参考:http://stackoverflow.com/questions/298745/how-do-i-send-a-cross-domain-post-request-via-javascript#answer-6169703
参考:http://softwareas.com/cross-domain-communication-with-iframes
参考:http://thomas.bindzus.me/2007/12/24/adding-dynamic-contents-to-iframes/
优点:兼容性佳,facebook,google,新浪已/曾采用
缺点:依赖hack实现,响应数据量大时需要切片、多次设置fragment并轮询,响应频繁时可能失效。
3、server proxy
概述:当前域实现一个代理,所有向外部域名发送的请求都径由该代理中转。
缺点:每个使用方都需要部署代理,数据中转低效,对js有侵入。
4、flash proxy
概述:利用不可见的swf跨域post提交数据,需要部署crossdomain.xml。例如alirte会自动检测,若用户安装了flash,则以此实现跨域通信。
要求:flash9
参考:http://flxhr.flensed.com/
优点:ADOBE标准方案,相对CORS兼容性佳,相对invisible iframe响应数据量较大时优势明显。
缺点:依赖flash。
我最后选择了使用代理的模式,在js中写你跳转java的函数的路径(如 test!postRequestForRonglian.action),然后在Java代码中写入函数,如下
//url:外部的网址 params:json格式的字符串,要传入的参数
public static String postRequestForRonglian(String url, String params){
try {
URL u = new URL(url);
HttpURLConnection httpCon = (HttpURLConnection)u.openConnection();
httpCon.setDoOutput(true);
httpCon.setDoInput(true);
httpCon.setUseCaches(false);
//跳转的方式
httpCon.setRequestMethod("POST");
//连接超时的时间
httpCon.setConnectTimeout(3000);
//以下是设置包头的信息
httpCon.setRequestProperty("Accept", "application/json");
httpCon.setRequestProperty("Content-Type", "application/json;charset=utf-8");
httpCon.setRequestProperty("Authorization", auto);
OutputStreamWriter osw = new OutputStreamWriter(httpCon.getOutputStream(), "UTF-8");
osw.write(params);
osw.flush();
osw.close();
StringBuffer sb = new StringBuffer();
//若连接成功的话,获取数据
if(HttpURLConnection.HTTP_OK == httpCon.getResponseCode()){
String rdLine;
BufferedReader br = new BufferedReader(new InputStreamReader(httpCon.getInputStream(), "UTF-8"));
while((rdLine = br.readLine()) != null){
sb.append(rdLine);
}
br.close();
}
return sb.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
0 0
- 代理post跨域请求
- post跨域请求问题
- POST请求跨域问题
- POST异步请求方式(使用代理)
- Ajax get,post 的跨域请求
- POST 请求的跨域实现
- angularjs中post请求进行跨域
- Ajax的Post跨域请求
- ajax POST跨域请求完美解决
- 支持POST的跨域请求CORS
- vue解决POST跨域请求
- js使用XMLHttpRequest实现跨域请求 POST请求
- web端get和post请求支持跨域请求
- Nginx代理搞定跨域请求
- Nginx反向代理实现跨域请求
- ajax跨域post请求的java代理实现
- JAVA 动态替换代理IP并模拟POST请求
- Java实现Http的Post、Get、代理访问请求
- 需要记住的人
- camera log分析
- 网络号和网关区别以及ip的范围分类
- Android 添加系统服务
- UIImageView实现简单动画
- 代理post跨域请求
- Hadoop--map-reduce原理
- MySQL ERROR 1025(HY000): Error on rename of ...
- public/private/protected浅显易懂
- rm命令改写
- Flume学习笔记之初识(二)
- 解决 Code::Blocks之It seems that this file has not been built yet.
- vuejs使用指南(一)
- 自动远程拷贝expect脚本