分享

求教xmlhttp 跨域访问rss "没有权限"解决 - AJAX问必答 - 无忧AJAX...

 kenwang 2007-06-30
var xmlhttp;
function readRSS() {
    createXMLHttpRequest();     
    xmlHttp.onreadystatechange = handleStateChange;
    xmlHttp.open("GET", "http://esoft./rss2.xml", true);
    xmlHttp.send(null);
}

function createXMLHttpRequest() {
    if (window.ActiveXObject) {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }else if (window.XMLHttpRequest) {
        xmlHttp = new XMLHttpRequest();
    }
}
function handleStateChange() {
    if(xmlHttp.readyState == 4) {
        if(xmlHttp.status == 200) {
            window.status=‘数据加载成功!‘;
            ResultSet();
        }else{
           alert("HTTP接收信息出错:状态"+request.status+"具体内容"+request.statusText);
  }
}else{
      forWait();       //进度条显示控制----等待
      window.status=‘数据加载中,请稍候...‘;
}
}

function forWait(){
      waitDiv.innerHTML="<img src=\"images/loading.gif\">";
}

function ResultSet() {
    var results = xmlHttp.responseXML;
    var title = null;
    var item = null;
    var link=null;
    //得到channel
     var ccc=results.getElementsByTagName("channel");
     var headtitle=ccc[0].getElementsByTagName("title")[0].firstChild.nodeValue;
     var headlink=ccc[0].getElementsByTagName("link")[0].firstChild.nodeValue;
     var cell = document.createElement("div");
     cell.innerHTML="<h1><a href="+headlink+" target=_blank>"+headtitle+"</a></h1><br>";
     //输出控制----标题
     resultRss.innerHTML="";
     resultRss.appendChild(cell);
     //得到items
     var items = results.getElementsByTagName("item");
     //计算需要显示的Rss个数     
     if(rssCount>=items.length){
     rssCount = items.length;
     }
     for(var i = 0; i < rssCount; i++) {
        item = items;
        link=item.getElementsByTagName("link")[0].firstChild.nodeValue;
        title = item.getElementsByTagName("title")[0].firstChild.nodeValue;
        var cell = document.createElement("div");
        cell.innerHTML=(i+1)+".<a href="+link+" target=_blank>"+title+"</a><br>";
        //输出控制----详细内容
        resultRss.appendChild(cell);
     }
}


[ 本帖最后由 guwei0530 于 2007-4-22 21:29 编辑 ]

顶部
[广告]
hopesoft (琥珀)
校长
Rank: 9Rank: 9Rank: 9


UID 1
精华 2
积分 188
帖子 223
阅读权限 200
注册 2006-2-17
来自 Beijing
状态 离线
发表于 2007-4-23 13:04  资料  个人空间  主页 短消息  加为好友  添加 hopesoft 为MSN好友 通过MSN和 hopesoft 交谈
如果要通过AJAX访问本站之外的数据,可做一个代理页把远程数据抓取到本地,再用ajax读取。

可参考首页源码 http://www./bbs/viewthread.php?tid=519





欢迎光临无忧AJAX!分享 交流 进步!
顶部
guwei0530
小学生
Rank: 1



UID 3119
精华 0
积分 0
帖子 4
阅读权限 10
注册 2007-4-20
状态 离线
发表于 2007-4-23 13:30  资料  个人空间  短消息  加为好友 
不好意思,校长,忘了说我需要在JAVA环境下处理。
PHP我不懂。可否在指点一下?

顶部
guwei0530
小学生
Rank: 1



UID 3119
精华 0
积分 0
帖子 4
阅读权限 10
注册 2007-4-20
状态 离线
发表于 2007-4-23 15:00  资料  个人空间  短消息  加为好友 
经过多番努力,问题终于得到解决。感谢校长的提示。
在此说明解决方法: 同样类似使用代理的意念,在java内写一个servlet来处理这个问题。
详细处理方式是:1.首先,同样使用xmlhttp方式处理;
                        2.然后,在进行open提交的时候,不直接提交到对应数据源所在的URL地址。而是提交到代理程序,而通过代理程序打开需要读取的数据源URL,同时处理读取并返回。
                       3.最后,重新用xmlhttp进行解析显示处理即可以实现跨域读取RSS源。
修改上面的js代码:
     var PROXY_SERVLET_URL="../../proxyServlet?url=";//对应配置的servlet参数
     if(url.toLowerCase().indexOf("[url=http://]http://")==-1[/url]){
        readRSS(url);
     }else{
      url = PROXY_SERVLET_URL + url;
        readRSS(url);
     }

java源代码如下:
package action;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ProxyServletUtil extends HttpServlet {
/**
  *
  */
private static final long serialVersionUID = 1L;

private int READ_BUFFER_SIZE = 1024;

public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    String urlString = request.getParameter("url");
    writeResponse(response, urlString);
    }

private void writeResponse(HttpServletResponse response, String urlString) throws ServletException{
   try {
    URL url = new URL(urlString);
    URLConnection urlConnection = url.openConnection();
    response.setContentType(urlConnection.getContentType());
    InputStream ins = urlConnection.getInputStream();
    OutputStream outs = response.getOutputStream();
    byte[] buffer = new byte[READ_BUFFER_SIZE];
    int bytesRead = 0;
    while ((bytesRead = ins.read(buffer, 0, READ_BUFFER_SIZE)) != -1) {
     outs.write(buffer, 0, bytesRead);
    }
    System.out.println(outs);
    outs.flush();
    outs.close();
    ins.close();
   } catch (Exception e) {
    try {
     response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
    } catch (IOException ioe) {
     throw new ServletException(ioe);
    }
   }
   }
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约