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 相关文章推荐
javascript新手语法小结
Jun 15 Javascript
prototype 中文参数乱码解决方案
Nov 09 Javascript
Javascript基础教程之数组 array
Jan 18 Javascript
js动态生成Html元素实现Post操作(createElement)
Sep 14 Javascript
详述JavaScript实现继承的几种方式(推荐)
Mar 22 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
May 12 Javascript
JQuery动态添加Select的Option元素实现方法
Aug 29 Javascript
关于javascript事件响应的基础语法总结(必看篇)
Dec 26 Javascript
深入理解ES6 Promise 扩展always方法
Sep 26 Javascript
js实现数字从零慢慢增加到指定数字示例
Nov 07 Javascript
使用js获取身份证年龄的示例代码
Dec 11 Javascript
vue实现登录功能
Dec 31 Vue.js
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 批量更新网页内容实现代码
2010/01/05 PHP
PHP 设计模式之观察者模式介绍
2012/02/22 PHP
PHP实现WebService的简单示例和实现步骤
2015/03/27 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
2016/09/30 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
JavaScript 原型链学习总结
2010/10/29 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
详解angularjs中如何实现控制器和指令之间交互
2017/05/31 Javascript
vue弹窗组件使用方法
2018/04/28 Javascript
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
vue-cli3全面配置详解
2018/11/14 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
基于vue实现web端超大数据量表格的卡顿解决
2019/04/02 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
详解ES6数组方法find()、findIndex()的总结
2020/05/12 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
Python 12306抢火车票脚本
2018/02/07 Python
Python打印输出数组中全部元素
2018/03/13 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
python实现微信打飞机游戏
2020/03/24 Python
Python小白垃圾回收机制入门
2020/06/09 Python
canvas绘图按照contain或者cover方式适配并居中显示
2019/02/18 HTML / CSS
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
委托书英文
2015/01/28 职场文书
放假通知
2015/04/14 职场文书
紫日观后感
2015/06/05 职场文书
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js