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学习笔记(3)--用jquery(插件)实现多选项卡功能
Apr 08 Javascript
在JavaScript中实现类的方式探讨
Aug 28 Javascript
JS截取字符串常用方法详细整理
Oct 28 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
Mar 12 Javascript
详解AngularJS中的http拦截
Feb 09 Javascript
JavaScript笔记之数据属性和存储器属性
Mar 31 Javascript
前端设计师们最常用的JS代码汇总
Sep 25 Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
Jan 12 Javascript
微信小程序实现美团菜单
Jun 06 Javascript
vue+axios+mock.js环境搭建的方法步骤
Aug 28 Javascript
微信小程序收货地址API兼容低版本解决方法
May 18 Javascript
基于VSCode调试网页JavaScript代码过程详解
Jul 20 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中SESSION使用中的一点经验总结
2012/03/30 PHP
PHP截取发动短信内容的方法
2017/07/04 PHP
tp5框架内使用tp3.2分页的方法分析
2019/05/05 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
为超链接加上disabled后的故事
2010/12/10 Javascript
将Datatable转化成json发送前台实现思路
2013/09/06 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
jQuery实现的可编辑表格完整实例
2016/06/20 Javascript
Vue渲染函数详解
2017/09/15 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
2018/08/27 Javascript
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
vue 中固定导航栏的实例代码
2019/11/01 Javascript
uni-app如何页面传参数的几种方法总结
2020/04/28 Javascript
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
vscode 远程调试python的方法
2017/12/01 Python
Flask之请求钩子的实现
2018/12/23 Python
python的sorted用法详解
2019/06/25 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
Python读取Excel一列并计算所有对象出现次数的方法
2020/09/04 Python
Pycharm新手使用教程(图文详解)
2020/09/17 Python
总经理工作职责范文
2014/03/14 职场文书
幼儿教师寄语集锦
2014/04/03 职场文书
代领毕业证委托书
2014/08/02 职场文书
2014年乡镇人大工作总结
2014/11/25 职场文书
2014年小学教导处工作总结
2014/12/19 职场文书
大二学年个人总结
2015/03/03 职场文书
庆元旦主持词
2015/07/06 职场文书
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python
python 进阶学习之python装饰器小结
2021/09/04 Python