首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Ajax >

基于JAVA的ajax署理的研究实现

2012-11-14 
基于JAVA的ajax代理的研究实现?一.ajax 跨域理论基础?http://blog.csdn.net/jamesxu326/archive/2008/12/1

基于JAVA的ajax代理的研究实现

?

一.ajax 跨域理论基础

?

http://blog.csdn.net/jamesxu326/archive/2008/12/11/3496283.aspx

?

?

二.ajax 跨域问题 的一个演示小例子

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd"><HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>AJAX跨域验证</TITLE><script>var xmlHttp;function createXMLHttpRequest() {    if (window.ActiveXObject) {        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");    }     else if (window.XMLHttpRequest) {        xmlHttp = new XMLHttpRequest();    }}function hello() { var url = 'http://www.baidu.com';     createXMLHttpRequest(); xmlHttp.onreadystatechange = showResponse; xmlHttp.open("GET", url, true); xmlHttp.send(null);}function showResponse(){  if(xmlHttp.readyState == 4) { if(xmlHttp.status == 200) {          document.getElementById("result").setAttribute("value",xmlHttp.responseText) ; } }}</script></HEAD><BODY>  <input type="button" value="hello" onclick="hello()"><br/><br/> <textarea id="result" name="result" cols=100 rows=100 ></textarea></BODY></HTML>

?

?1.以上的网页对这个测试页面只有在一种情况下才能正常执行:就是通过IE打开本地文件。如果用FireFox就算是通过本地文件打开它也不能正常运行(firefox 对跨域要求比较严格)

2.把这个页面放在TOMCat 上跑 效果也是一样的

?

?

.一个自己写的 ajax 请求代理

???? 问题:工作环境使用的代理的方式上网,甲方因为一些原因吧google给屏蔽了,上网搜东西只能用百度了,可是百度真差劲,搜技术问题没有google 搜的全,因此想到使用google 的搜索api

?

使用帮助 见: http://code.google.com/intl/zh-CN/apis/ajaxsearch/documentation/

?

?

这个google 搜素 对外提供一个ajax 服务,由于局方封锁的是 www.google.com ,对于 http://ajax.googleapis.com?可以逃过一劫,因此考虑 ajax 技术 调用远端 google 提供的ajax搜素服务,将返回的json的 搜索结果解析后显示在页面上,然后将这个简单的服务 放在 websphere 供大家使用,类似这样

?

http://***.***.***.***:9090/google

?

这时候就遇到ajax 的跨域问题了,因为这个ajax 请求访问了 公网的 http://code.google.com?,这个外部地址和 上下文根 /google 不在同一个域中 ,因此 外网用户无法使用 IE 是 弹出一个提示框 ,确认后勉强可以使用,而火狐对ajax 跨域要求严格,不能使用ajax 服务

?

?

?解决方案:

??

?????????? ajax 去请求 上下文跟下的一个servlet ->> servlet 中 构造一个 httpclient 对象 去请求 google ajax 服务--》》 最后将结果JSON 数据返回到前台

?

?ajax 请求代理

?

package cn.com.xinli.action.search;import java.io.OutputStreamWriter;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.HttpMethod;import org.apache.commons.httpclient.methods.GetMethod;import org.apache.log4j.Logger;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import cn.com.xinli.action.BaseAction;public class GoogleSearchAction extends BaseAction{Logger log=Logger.getLogger(GoogleSearchAction.class);@Overridepublic ActionForward doIt(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception{        //设置代理服务器地址和端口HttpClient client = new HttpClient(); //client.getHostConfiguration().setProxy("172.100.1.28",8080);        //使用GET方法,如果服务器需要通过HTTPS连接,那只需要将下面URL中的http换成httpsclient.setTimeout(6000);        String queryString=request.getQueryString();               log.info("queryString>>>>>>>>>:"+queryString);        HttpMethod method = new GetMethod("http://ajax.googleapis.com/ajax/services/search/web?&rsz=large&v=1.0"+queryString);        //使用POST方法        //HttpMethod method = new PostMethod("http://java.sun.com");        client.executeMethod(method);        //打印服务器返回的状态        log.info("服务器返回的状态:"+method.getStatusLine());        //打印返回的信息        String result=null;        result=method.getResponseBodyAsString();       // log.info("返回的信息:"+result);        method.releaseConnection();         /*将结果写到输出流里面*/        ServletOutputStream out = response.getOutputStream();          OutputStreamWriter ow = new OutputStreamWriter(out,"utf-8");          ow.write(result);          ow.flush();          ow.close();//response.setContentType("text/html;charset=UTF-8");//      response.getWriter().write("<script type='text/javascript'>alert(1);</script>");return null;}}

?

?

经过这样一番周折,使用servlet 作为 ajxa 请求代理,解决了跨域问题

?

附件中是完整的项目 在eclipse 中直接可以使用? (Ext+HttpClient)

?

?

?

遗留问题: 没有解决 搜索结果的分页问题, api中看到 请求参数中加 这样?start=一个整数

??

?可以完成翻页,没有试验!

???????

?

热点排行