JQuery Ajax通过Handler访问外部XML数据的代码

JQuery的使用非常简单,我们只需要从其官方网站上下载一个脚本文件并引用到页面上即可,然后你就可以在你的脚本代码中任意使用JQuery提供的对象和功能了。
  在JQuery中使用Ajax方法异步获取服务器资源非常简单,读者可以参考其官方网站上提供的例子http://api.jquery.com/category/ajax/。当然,作为客户端脚本,JQuery也会遇到跨域访问资源的问题,什么是跨域访问呢?简单来说就是脚本所要访问的资源属于网站外部的资源,脚本所在的位置和资源所在的位置不在同一区域。默认情况下,浏览器是不允许直接进行资源的跨域访问的,除非客户端浏览器有设置,否则访问会失败。在这种情况下,我们一般都会采用在服务器端使用handler来解决,就是说在脚本和资源之间建立一个桥梁,让脚本访问本站点内的handler,通过handler去访问外部资源。这个是非常普遍的做法,而且操作起来也非常简单,因为会经常使用到,所以在此记录一下,方便日后使用!
  首先需要在网站中创建一个handler,在Visual Studio中新建一个Generic Handler文件,拷贝下面的代码:


代码如下:

<%@ WebHandler Language="C#" Class="WebApplication1.Stock" %>
namespace WebApplication1
{
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;
using System.Collections.Generic;
using System.Linq;
/// <summary>
/// Asynchronous HTTP handler for rendering external xml source.
/// </summary>
public class Stock : System.Web.IHttpAsyncHandler
{
private static readonly SafeList safeList = new SafeList();
private HttpContext context;
private WebRequest request;
/// <summary>
/// Gets a value indicating whether the HTTP handler is reusable.
/// </summary>
public bool IsReusable
{
get { return false; }
}
/// <summary>
/// Verify that the external RSS feed is hosted by a server on the safe list
/// before making an asynchronous HTTP request for it.
/// </summary>
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
var u = context.Request.QueryString["u"];
var uri = new Uri(u);
if (safeList.IsSafe(uri.DnsSafeHost))
{
this.context = context;
this.request = HttpWebRequest.Create(uri);
return this.request.BeginGetResponse(cb, extraData);
}
else
{
throw new HttpException(204, "No content");
}
}
/// <summary>
/// Render the response from the asynchronous HTTP request for the RSS feed
/// using the response's Expires and Last-Modified headers when caching.
/// </summary>
public void EndProcessRequest(IAsyncResult result)
{
string expiresHeader;
string lastModifiedHeader;
string rss;
using (var response = this.request.EndGetResponse(result))
{
expiresHeader = response.Headers["Expires"];
lastModifiedHeader = response.Headers["Last-Modified"];
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream, true))
{
rss = reader.ReadToEnd();
}
}
var output = this.context.Response;
output.ContentEncoding = Encoding.UTF8;
output.ContentType = "text/xml;"; // "application/rss+xml; charset=utf-8";
output.Write(rss);
var cache = output.Cache;
cache.VaryByParams["u"] = true;
DateTime expires;
var hasExpires = DateTime.TryParse(expiresHeader, out expires);
DateTime lastModified;
var hasLastModified = DateTime.TryParse(lastModifiedHeader, out lastModified);
cache.SetCacheability(HttpCacheability.Public);
cache.SetOmitVaryStar(true);
cache.SetSlidingExpiration(false);
cache.SetValidUntilExpires(true);
DateTime expireBy = DateTime.Now.AddHours(1);
if (hasExpires && expires.CompareTo(expireBy) <= 0)
{
cache.SetExpires(expires);
}
else
{
cache.SetExpires(expireBy);
}
if (hasLastModified)
{
cache.SetLastModified(lastModified);
}
}
/// <summary>
/// Do not process requests synchronously.
/// </summary>
public void ProcessRequest(HttpContext context)
{
throw new InvalidOperationException();
}
}
/// <summary>
/// Methods for matching hostnames to a list of safe hosts.
/// </summary>
public class SafeList
{
/// <summary>
/// Hard-coded list of safe hosts.
/// </summary>
private static readonly IEnumerable<string> hostnames = new string[]
{
"cnblogs.com",
"msn.com",
"163.com",
"csdn.com"
};
/// <summary>
/// Prefix each safe hostname with a period.
/// </summary>
private static readonly IEnumerable<string> dottedHostnames =
from hostname in hostnames
select string.Concat(".", hostname);
/// <summary>
/// Tests if the <paramref name="hostname" /> matches exactly or ends with a
/// hostname from the safe host list.
/// </summary>
/// <param name="hostname">Hostname to test</param>
/// <returns>True if the hostname matches</returns>
public bool IsSafe(string hostname)
{
return MatchesHostname(hostname) || MatchesDottedHostname(hostname);
}
/// <summary>
/// Tests if the <paramref name="hostname" /> ends with a hostname from the
/// safe host list.
/// </summary>
/// <param name="hostname">Hostname to test</param>
/// <returns>True if the hostname matches</returns>
private static bool MatchesDottedHostname(string hostname)
{
return dottedHostnames.Any(host => hostname.EndsWith(host, StringComparison.InvariantCultureIgnoreCase));
}
/// <summary>
/// Tests if the <paramref name="hostname" /> matches exactly with a hostname
/// from the safe host list.
/// </summary>
/// <param name="hostname">Hostname to test</param>
/// <returns>True if the hostname matches</returns>
private static bool MatchesHostname(string hostname)
{
return hostnames.Contains(hostname, StringComparer.InvariantCultureIgnoreCase);
}
}
}

我给出的例子中是想通过Ajax异步取得msn站点上微软的股票信息,其外部资源地址为http://money.service.msn.com/StockQuotes.aspx?symbols=msft,我们在页面上这样使用JQuery api通过Handler来访问数据:


代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
</head>
<body>
<div id="con">
<span id="loader">loading...</span>
</div>
<script type="text/javascript">
function getData() {
$("#loader").ajaxStart(function() {
$(this).show();
});
$("#loader").ajaxComplete(function() {
$(this).hide();
});
$.ajax({
type: "GET",
url: "Stock.ashx?u=http://money.service.msn.com/StockQuotes.aspx?symbols=msft",
dataType: "xml",
success: function(data) {
var last = "";
var change = "";
var percentchange = "";
var volume = "";
var cap = "";
var yearhigh = "";
var yearlow = "";
$(data).find('ticker').each(function() {
last = $(this).attr('last');
change = $(this).attr('change');
percentchange = $(this).attr('percentchange');
volume = $(this).attr('volume');
cap = $(this).attr('marketcap');
yearhigh = $(this).attr('yearhigh');
yearlow = $(this).attr('yearlow');
document.getElementById('con').innerHTML = '<span>name:' + last + '    high:' + volume + '    low:' + cap + '</span>';
})
}
});
}
$(window).load(getData);
</script>
</body>
</html>

下面是实现的结果:
name:25.8 high:67,502,221 low:$226,107,039,514
  Handler的写法基本都大同小异,因此可以写成一个通用的例子,以后如遇到在脚本中需要跨域访问资源时便可以直接使用!代码记录于此,方便查阅。

(0)

相关推荐

  • Jquery Ajax学习实例 向页面发出请求,返回XML格式数据

    一.AjaxSample.aspx 处理业务数据,产生XML数据,供JqueryRequest.aspx调用,代码如下: 复制代码 代码如下: protected void Page_Load(object sender, EventArgs e) { string uid = Request.QueryString["username"]; string pwd = Request.QueryString["password"]; Response.Content

  • JQuery的ajax获取数据后的处理总结(html,xml,json)

    1.html处理比较简单,直接输出即可.一般用$("jb51div").innerHTML等即可 2.json格式数据调用 复制代码 代码如下: $.ajax({ url : "/trundle/RawContentAction.getAjaxContent.act", data : "param1=22", dataType : "json",//这里的dataType就是返回回来的数据格式了html,xml,json ca

  • 通过AJAX的JS、JQuery两种方式解析XML示例介绍

    JQuery版 复制代码 代码如下: $.ajax({ url : "order/order_orderDetail.do?params.type=merge", type : "post", data : params, success : function(xml) { hide(); if(xml == ""){ Dialog.popTip("找不到需要合并的订单", 2); }else{ var myTable=doc

  • 用JQuery 实现AJAX加载XML并解析的脚本

    1,Content-Type 很多时候无法解析就是Content-Type的问题. 如果本身就是xml文件,请跳过这一步 动态生成的XML一定要将其设置为text/xml,否则默认就是text/html也就是普通的文本了. 常见语言的Content-Type设置 复制代码 代码如下: header("Content-Type:text/xml"); //php response.ContentType="text/xml" //asp response.setHea

  • javascript验证身份证完全方法具体实现

    复制代码 代码如下: var certCardValid = function(id){         var arrVerifyCode = [1,0,"x",9,8,7,6,5,4,3,2];         var wi = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];         var Checker = [1,9,8,7,6,5,4,3,2,1,1];         var msg = "";         if

  • JQuery Ajax通过Handler访问外部XML数据的代码

    JQuery的使用非常简单,我们只需要从其官方网站上下载一个脚本文件并引用到页面上即可,然后你就可以在你的脚本代码中任意使用JQuery提供的对象和功能了. 在JQuery中使用Ajax方法异步获取服务器资源非常简单,读者可以参考其官方网站上提供的例子http://api.jquery.com/category/ajax/.当然,作为客户端脚本,JQuery也会遇到跨域访问资源的问题,什么是跨域访问呢?简单来说就是脚本所要访问的资源属于网站外部的资源,脚本所在的位置和资源所在的位置不在同一区域.

  • jQuery Ajax提交表单查询获得数据实例代码

    看一个用jQuery提交表单ajax查询的例子. 基本功能:用户输入一个表单,输入准考证和验证码,验证用户是否输入表单,点击查询提交,然后从服务器得到返回的数据并显示出来. 代码如下: jQuery部分: 复制代码 代码如下: <script language="javascript" type="text/javascript"> $(document).ready(function() { $("#btnSubmit").clic

  • jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例

    本文实例讲述了jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作.分享给大家供大家参考,具体如下: 1.先给json格式的数据: [ {"id":1,"name":"stan"}, {"id":2,"name":"jack"}, {"id":3,"name":"lucy"}, {"id&quo

  • jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解

    本文使用jQuery,结合PHP和Mysql,通过实例讲解如何实现Ajax数据加载效果. HTML <div id="list"> <ul></ul> </div> <div id="pagecount"></div> 页面中,#list用来展示数据列表,包括本例要展示的商品图片和标题,#pagecount用来展示分页条,即本例中的上一页.下一页. 当然,别忘了,在head中预先载入jquery

  • jQuery Ajax实现Select多级关联动态绑定数据的实例代码

    jQuery选择插件分为基本版和美化版,重点说下美化版,如下图所示: 相比最原始的版本,美化后的选择插件可以说是很漂亮了且功能更加强大(这里不说了,自行发掘吧).这里主要是添加了它的特有属性并调用 class="chzn-select": jsp页面: <select class="chzn-select" id="CODE" name="CODE"> ...... </select> js页面: $(

  • jquery ajax局部加载方法详解(实现代码)

    在jquery中实现ajax加载的方法有很多种,不像以前的js的ajax只有那一种,下面我们介绍jquery ajax实现局部加载方法总结,有需要了解的朋友可参考. 例 $.ajax({ url: "hotelQuery!queryHotelByCity.action", type: "post", dataType: "html", data: "queryHotel.city="+cityobj.value+"&

  • Ajax如何传输Json和xml数据

    ajax传输xml数据:只要把数据封装成xml格式就可以实现传输,前台js用responseXML接收xml参数,后台读取用流和dom4j来解析 前台页面 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix=&q

  • 利用jQuery接受和处理xml数据的代码(.net)

    效果如下: 服务器端 复制代码 代码如下: package com.ljq.test; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import java.io.IOException; import

  • 在jquery中处理带有命名空间的XML数据

    但不幸的是,很多服务返回的数据仍然是XML格式的. jquery对于xml这种数据的处理是内置支持的,这一点没有任何问题.但前提是返回的数据没有带任何命名空间.例如下面这份数据 复制代码 代码如下: <?xml version="1.0" encoding="utf-8" ?> <data> <Employee id="1" firstName="ares" lastName="chen

  • asp.net中利用Jquery+Ajax+Json实现无刷新分页的实例代码

    复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="AjaxJson.aspx.cs" Inherits="AjaxJson" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR

随机推荐