jsonp跨域,cors跨域分享以及HttpClient跨域
来源:互联网 发布:淘宝店铺名称旗舰店 编辑:程序博客网 时间:2024/04/28 20:07
最近开发项目,需要跨域访问别人家的接口。
于是在此相对,在这次开发中的跨域问题做个总结。
1.最开始用的是JSONP,JSONP大家应该也都比较熟悉,
$.ajax({url: url,method: 'POST',dataType: 'jsonp', jsonp: 'callback', jsonpCallback: 'callbackFunction',data:{saruLruid:saruLruid,transAmt:transAmt...},success: function(data){if(data.resultCode == 0) {orderNum=data.orderNo; window.location.href="phoneCode.jsp?orderNum="+orderNum;} else {alert(data.errorMsg);}},error: function(data) {}});
就是对方 返回的数据 必须是 如下格式: callbackFunction(json); 这样的格式, 这边的callbackFunction 就是我们 在ajax 那设置的 jsonpcallback 函数名。 只有这样我们才能成功的 接收到对方返回回来的数据。不然就会报Uncaught SyntaxError: Unexpected token .
所以如果用jsonp实现跨域最好是对方的接口是你们自己人提供的可以给予你修改的否则还是考虑HttpClient跨域。
2.HttpClient跨域
要用 这个 得 先导入包
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
// 创建 HttpClient 的实例 HttpClient httpClient = new HttpClient(); response.setCharacterEncoding("utf-8"); response.setContentType("text/json"); //获得跳转地址 String realname = URLEncoder.encode("陈江华", "UTF-8"); String tm = new Date().getTime()+""; String url = "http://121.41.42.121:8080/v3/card4-server"; PostMethod postMethod = new PostMethod(url);
//这部很重要,这样传入的中文参数才能正确的被识别 postMethod.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"utf-8"); //添加函数 postMethod.addParameter("mall_id", mall_id); postMethod.addParameter("sign", sign); // 执行postMethod int statusCode = httpClient.executeMethod(postMethod); //输出回应 InputStream is = postMethod.getResponseBodyAsStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8")); String line = ""; JSONObject json = new JSONObject(); while ((line = br.readLine()) != null) { json= (JSONObject) JSON.parse(line);//在这边将对方接口返回的数据转为json System.out.println(line); }
//查看缓存 /* Cookie[] cookies = httpClient.getState().getCookies(); System.out.println("cookies length = " + cookies.length + " state=" + statusCode); for (int i = 0; i < cookies.length && cookies.length!=0; i++) { System.out.println("cookie - " + i + ":"); System.out.println(cookies.toString()); System.out.println(cookies[i].getDomain()); System.out.println(cookies[i].getName()); System.out.println(cookies[i].getPath()); System.out.println(cookies[i].getValue()); System.out.println("---------------------"); } int a = HttpStatus.SC_OK; Map m = new HashMap(); */ // HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发 // 301或者302 /* if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY || statusCode == HttpStatus.SC_MOVED_TEMPORARILY) { Header header = (Header) postMethod.getResponseHeader("location"); String location = null; if (header != null) { location = header.getValue(); System.out.println("aaaaaaaa" + location); if((location == null) || location.equals("")){ location = "/"; } GetMethod redirect = new GetMethod(location); httpClient.executeMethod(redirect); redirect.releaseConnection(); //存放最终跳转的链接 m.put("dispatchUrl", location); }else{ } postMethod.releaseConnection();
return json.toJSONStringl;
3.接下来要讲的是 cors跨域.
cors跨域资源分享。我的理解是将资源分享给别人,允许别人可以跨域访问你。
我 之前没搞懂是这个意思,一直搞这个就在想怎么都跨域访问不了别人。最后才知道是允许别人访问你。
用使用这个很简单, 只要在web.xml 加上如下配置
<!-- CORS过滤器 start --> <!-- <filter> <filter-name>cors</filter-name> <filter-class>com.pay.filter.CorsFilter</filter-class> </filter> <filter-mapping> <filter-name>cors</filter-name> <url-pattern>/api/*</url-pattern> </filter-mapping> --><!-- CORS过滤器 end -->
然后
@Component public class CorsFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) servletResponse; response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization"); response.setHeader("Access-Control-Allow-Credentials", "true"); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } }还有重要的一点是得导入两个包 。
<!-- 跨域 分享--><dependency> <groupId>com.thetransactioncompany</groupId> <artifactId>cors-filter</artifactId></dependency><dependency><groupId>com.thetransactioncompany</groupId><artifactId>java-property-utils</artifactId></dependency>
3种跨域 大家根据自己的需求进行选择。~~ 希望能帮到大家。
如上有哪错误的欢迎各位大神提出。谢谢~~
于是在此相对,在这次开发中的跨域问题做个总结。
1.最开始用的是JSONP,JSONP大家应该也都比较熟悉,
2 0
- jsonp跨域,cors跨域分享以及HttpClient跨域
- 跨域-JSONP/CORS
- Jsonp 跨域and 跨域资源共享 CORS 详解
- cors跨域(以及和jsonp的区别)
- 跨域请求 JSONP & CORS
- JSONP跨域,CORS跨域,Hybrid APP跨域
- Ajax----原生,jquery, 跨域:jsonp, cors
- 跨域请求解决方法(JSONP, CORS)
- jsonp和CORS跨域实现
- JSONP与 CORS 跨域请求
- 跨域请求jsonp与cors
- 跨域请求问题 : jsonp & CORS
- 跨域问题解决方案(HttpClient安全跨域 & jsonp跨域)
- 跨域问题解决方案(HttpClient安全跨域 & jsonp跨域)
- 跨域问题解决方案(HttpClient安全跨域 & jsonp跨域)
- 跨域问题解决方案(HttpClient安全跨域 & jsonp跨域)
- 跨域问题解决方案(HttpClient安全跨域 & jsonp跨域)
- 跨域问题解决方案(HttpClient安全跨域 & jsonp跨域)
- LPC824_VEML6075紫外检测模块学习笔记(ch1 + ch2)
- eclipse+maven创建多模块web工程
- JNI开发指南
- 5055. 树上路径
- JavaScript之onscroll事件
- jsonp跨域,cors跨域分享以及HttpClient跨域
- virtualbox实现虚拟机中共享本地目录
- 一个基于React Native实现的美食类APP。
- 史上最简单的SpringCloud教程 | 第十篇: 高可用的服务注册中心
- 排序算法总结与C++实现(冒泡、简单选择、直接插入、堆、归并、快速)
- Android开发中网络调试利器Postman安装教程
- jQuery学习五-DOM和CSS操作
- android自动化测试Uiautomator源码分析之三
- 1037. 在霍格沃茨找零钱(20)