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 相关文章推荐
删除重复数据的算法
Nov 23 Javascript
Google Map Api和GOOGLE Search Api整合实现代码
Jul 18 Javascript
JavaScript编程开发中的五个实用小技巧
Jul 22 Javascript
node.js中的console.warn方法使用说明
Dec 09 Javascript
JS 数字转换为大写金额的简单实例
Aug 04 Javascript
Jquery表单验证失败后不提交的解决方法
Oct 18 Javascript
JS实现颜色梯度与渐变效果完整实例
Dec 30 Javascript
360doc网站不登录就无法复制内容的解决方法
Jan 27 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
Jun 27 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
Nov 05 Javascript
elementui实现预览图片组件二次封装
Dec 29 Javascript
js正则匹配markdown里的图片标签的实现
Mar 24 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实现递归循环每一个目录
2010/08/08 PHP
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
js中设置元素class的三种方法小结
2011/08/28 Javascript
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
JS弹出窗口插件zDialog简单用法示例
2016/06/12 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
vue组件间通信解析
2017/03/01 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
简单了解vue中的v-if和v-show的区别
2019/10/08 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
[02:09]EHOME夺得首届辉夜杯冠军—现场颁奖仪式
2015/12/28 DOTA
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
Python Mysql自动备份脚本
2008/07/14 Python
Python中判断输入是否为数字的实现代码
2018/05/26 Python
python list转矩阵的实例讲解
2018/08/04 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
Python IDLE或shell中切换路径的操作
2020/03/09 Python
萌新HTML5 入门指南(二)
2020/11/09 HTML / CSS
柯基袜:Corgi Socks
2017/01/26 全球购物
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
智能家居、吸尘器、滑板车、电动自行车网上购物:Geekmaxi
2021/01/18 全球购物
异常和异常类的概念
2014/09/12 面试题
教师绩效工资方案
2014/02/01 职场文书
公司授权委托书
2014/04/04 职场文书
作风建设年活动总结
2014/08/27 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
CSS3实现列表无限滚动/轮播效果
2021/06/23 HTML / CSS
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers