Ajax跨域实现代码(后台jsp)


Posted in Javascript onJanuary 21, 2017

AJAX 教程

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

在应用时主要是创建XMLHttpRequest对象,调用指定服务地址。

但是IE中各个版本支持的不太一样,所以在创建次对象时可能要特殊处理下。

一般如下:

function createXMLHttpRequest(){
 var xmlhttp;
 try{
  xmlhttp = new XMLHttpRequest();//ie7及以上,其他浏览器
 }catch(e){
  try{
   xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");//ie6
  }catch(e){
   try{
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");//ie6以下
   }catch(e){
    throw "创建AJAX对象失败!";
   }
  }
 }
 return xmlhttp;
 }


 var xmlhttp = createXMLHttpRequest();
  xmlhttp.open("GET","http://localhost:8080/SimpleBlog/AjaxTest",true);
  xmlhttp.send(null);
  xmlhttp.onreadystatechange = function(result){
  if(xmlhttp.readyState==4 && xmlhttp.status == 200){
   alter(result.test);
  }
 };

但是浏览器再执行javascript代码时,有个著名的同源策略,这使得跨域请求就不是那么方便了。

那一般都是用什么方式支持跨域呢?

1、通过中间代理服务器,获取要跨域请求的数据。

2、通过iframe内嵌带请求域的页面,来解决跨域访问问题。

3、通过jsonp方式。

4、不过现在已经提出了XMLHttpRequest Level2(XHR2)允许跨域请求,不过要在server的返回头中显示声明允许跨域请求(浏览器的支持情况:http://caniuse.com/#feat=xhr2)。

下面简单说下jsonp与xtr2。

jsonp:

jsonp简单的说就是利用<script>标签来实现跨域请求的调用,因为浏览器中脚本的加载是不受同源策略影响的。

function get() {
  var url = 'http://localhost:8080/SimpleBlog/AjaxTest?callback=callback';
  var script = document.createElement('script'); 
  script.setAttribute("type","text/javascript"); 
  script.src = url; 
  document.body.appendChild(script); 
 }
 
 function callback(va){
  alert(va.test);
 }

服务端(java):

boolean jsonP = false;
 String cb = this.request.getParameter("callback");
 if (cb != null) {
 jsonP = true;
 response.setContentType("text/javascript");
 } else {
  response.setContentType("application/x-json");
 }
 PrintWriter out = response.getWriter();
 if (jsonP) {
  try {
   out.println(cb + "({\"test\":\"1\"})");
   out.flush();
   out.close();
  } catch (Exception e) {
   throw e;
  }
 }

这样就可以实现跨域调用了。

而我们经常用的jquery已经实现了此类方式的封装,使用起来更简单。

$(document).ready(function (){
  $('#jqueryajax').bind('click', function(){
  $.ajax({
   type: 'get',
   async: false,
   url: 'http://localhost:8080/SimpleBlog/AjaxTest1',
   dataType: 'jsonp',
   jsonp: 'callback',
   success: function(json){
    alert(json.result);
   },
   error: function(){
    alert('fail');
   }
  });
  });
 });

服务端(java):
我用了struts是这样写的:

public class AjaxTest1 extends ActionSupport {

 private String result;
 public String getResult() {
  return result;
 }
 
 public String execute() {
 
  this.result = "1";
  return "jqueryajax";
 }
}

配置文件:

<action name="AjaxTest1" class="AjaxTest1">
 <result name="jqueryajax" type="json">
  <param name="callbackParameter">callback</param>
 </result>
 </action>

下面说说xtr2:

这个就更简单了,直接创建调用即可。

function createCORSRequest(method,url){
  var xhr=new XMLHttpRequest();
  if('withCredentials' in xhr){
  xhr.open(method,url,true);
  }else if(typeof XDomainRequest!='undefined'){
   xhr=new XDomainRequest(); 
   xhr.open(method,url);
  }else{
   xhr=null;
  }
  return xhr;
 }
 
 function xhr2(){
  var request=createCORSRequest('GET','http://localhost:8080/SimpleBlog/AjaxTest1');
  if(request){
  request.onload=function(){
   alert(request.responseText);
  }
  request.onerror=function(e){
   alert('error');
  }
  request.send();
  } 
 }

服务端:其实只要在返回response中设置
httpResponse.addHeader("Access-Control-Allow-Origin", "*");
即可。

Javascript 相关文章推荐
兼容FireFox 的 js 日历 支持时间的获取
Mar 04 Javascript
prototype与jquery下Ajax实现的差别
Sep 13 Javascript
js获取url中指定参数值的示例代码
Dec 14 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
Jun 03 Javascript
jQuery实现的纵向下拉菜单实例详解【附demo源码下载】
Jul 09 Javascript
利用原生JS自动生成文章标题树的实例
Aug 22 Javascript
jquery.Callbacks的实现详解
Nov 30 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
Dec 08 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
May 17 Javascript
微信小程序 开发MAP(地图)实例详解
Jun 27 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
Feb 08 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
Mar 04 Javascript
JavaScript、C# URL编码、解码总结
Jan 21 #Javascript
Vue结合原生js实现自定义组件自动生成示例
Jan 21 #Javascript
jQuery基于正则表达式的表单验证功能示例
Jan 21 #Javascript
一篇文章搞定JavaScript类型转换(面试常见)
Jan 21 #Javascript
超全面的JavaScript开发规范(推荐)
Jan 21 #Javascript
Mongoose学习全面理解(推荐)
Jan 21 #Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
Jan 21 #Javascript
You might like
优化php效率,提高php性能的一些方法
2011/03/24 PHP
PHP7 弃用功能
2021/03/09 PHP
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
Bootstrap每天必学之折叠(Collapse)插件
2016/04/25 Javascript
javascript对象的相关操作小结
2016/05/16 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
JavaScript实现图片切换效果
2017/08/12 Javascript
js实现鼠标跟随运动效果
2020/08/02 Javascript
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
Python的迭代器和生成器使用实例
2015/01/14 Python
Python设置Socket代理及实现远程摄像头控制的例子
2015/11/13 Python
对numpy中array和asarray的区别详解
2018/04/17 Python
使用Python写一个量化股票提醒系统
2018/08/22 Python
Django forms组件的使用教程
2018/10/08 Python
Python时间序列处理之ARIMA模型的使用讲解
2019/04/02 Python
python读写配置文件操作示例
2019/07/03 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
Python 如何实现访问者模式
2020/07/28 Python
Myprotein葡萄牙官方网站:英国优质运动营养品牌
2016/09/12 全球购物
俄罗斯在线水暖商店:Perfecto.ru
2019/10/25 全球购物
学生个人的自我评价分享
2013/11/05 职场文书
美术教学感言
2014/02/22 职场文书
工程资料员岗位职责
2014/03/10 职场文书
绿色出行口号
2014/06/18 职场文书
光荣之路观后感
2015/06/12 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书