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 动态参数判空操作
Dec 22 Javascript
javascript 操作文件 实现方法小结
Jul 02 Javascript
javascript parseInt与Number函数的区别
Jan 21 Javascript
jQuery动态添加 input type=file的实现代码
Jun 14 Javascript
js判断游览器类型及版本号的代码
May 11 Javascript
一个判断抢购时间是否到达的简单的js函数
Jun 23 Javascript
JavaScript中的console.group()函数详细介绍
Dec 29 Javascript
jQuery中on()方法用法实例详解
Feb 06 Javascript
BootStrap Fileinput上传插件使用实例代码
Jul 28 Javascript
JavaScript new对象的四个过程实例浅析
Jul 31 Javascript
vue实现百度下拉列表交互操作示例
Mar 12 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
May 10 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利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
2017/02/10 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
JQuery中attr属性和jQuery.data()学习笔记【必看】
2016/05/18 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
浅谈在Vue.js中如何实现时间转换指令
2019/01/06 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
nodejs搭建本地服务器并访问文件操作示例
2019/05/11 NodeJs
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
jQuery实现数字华容道小游戏(实例代码)
2020/01/16 jQuery
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
全面解读Python Web开发框架Django
2014/06/30 Python
详解python之配置日志的几种方式
2017/05/22 Python
Python线程创建和终止实例代码
2018/01/20 Python
python实现自动登录
2018/09/17 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
python处理自动化任务之同时批量修改word里面的内容的方法
2019/08/23 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
结束运行python的方法
2020/06/16 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
新西兰网上购物,折扣店:BestDeals.co.nz
2019/03/20 全球购物
介绍一下Make? 为什么使用make
2013/12/08 面试题
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
2015年清明节活动总结
2015/02/09 职场文书
二年级数学教学反思
2016/02/16 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
2021/08/23 MySQL
第四次工业革命,打工人与机器人的竞争
2022/04/21 数码科技