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 相关文章推荐
jQuery 使用手册(三)
Sep 23 Javascript
cument.execCommand()用法深入理解
Dec 04 Javascript
js防止DIV布局滚动时闪动的解决方法
Oct 30 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
Jul 05 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
May 17 Javascript
vuejs实现本地数据的筛选分页功能思路详解
Nov 15 Javascript
webpack 单独打包指定JS文件的方法
Feb 22 Javascript
vue实现条件判断动态绑定样式的方法
Sep 29 Javascript
JointJS流程图的绘制方法
Dec 03 Javascript
js实现无限层级树形数据结构(创新算法)
Feb 27 Javascript
JS继承实现方法及优缺点详解
Sep 02 Javascript
js实现购物车商品数量加减
Sep 21 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
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
PHP+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
PHP使用xmllint命令处理xml与html的方法
2014/12/15 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
PHP实现基于mysqli的Model基类完整实例
2016/04/08 PHP
php面向对象值单例模式
2016/05/03 PHP
lib.utf.js
2007/08/21 Javascript
为原生js Array增加each方法
2012/04/07 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
2013/02/25 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
input输入密码变黑点密文的实现方法
2017/01/09 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
2017/03/08 Javascript
jQuery实现锚点向下平滑滚动特效示例
2017/08/29 jQuery
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
2019/08/07 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
2020/02/16 Javascript
python encode和decode的妙用
2009/09/02 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
keras的backend 设置 tensorflow,theano操作
2020/06/30 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
全球酒店预订网站:Hotels.com
2016/08/10 全球购物
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
作为网站管理者应当如何防范XSS
2014/08/16 面试题
2014年安全生产责任书
2014/07/22 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
十八大标语口号
2014/10/09 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
2015年七夕情人节感言
2015/08/03 职场文书
德能勤绩工作总结
2015/08/11 职场文书
MySQL基础(一)
2021/04/05 MySQL
Python基础之函数嵌套知识总结
2021/05/23 Python