ajax跨域请求解决方案

来源:互联网 发布:淘宝旺旺卖家版 千牛 编辑:程序博客网 时间:2024/04/28 01:47

ajax跨域请求解决方案有很多种方案,这里就讲讲我用的两种方案,其中特将其中一种方法。对于ajax跨域请求,我一般使用jsonp技术或者代理技术。其中代理技术是万能的,jsonp技术是有条件限制的,如果第三方接口返回的数据是jsonp格式(即:callbackfunction(json数据格式)),则可以使用jsonp技术,否则用不了。这里重点讲解代理技术。先说说代理技术的实现原理。现在有A,B两个项目且两个项目不在同一个域下,A项目需要调用B项目接口,如果我在页面中直接采用ajax技术调用B项目接口,则不会得到数据,那么我们可以不用再页面中直接对B项目接口发送请求,我们可以这么做。1、A项目在后台采用httpclient或者Java自带的socket发送get、post请求,将返回的数据保存在一个变量中,2、A项目写一个接口,功能是将从B项目接口返回的数据返回给页面,3、页面发送请求由原来的直接对B项目接口发送请求改为对A创建的接口发送请求,这样页面就可以通过A的代理获取到B接口的数据,而不用直接去访问B项目接口,好了,看下面关于代理技术,目前提供的案例是获取淘宝ip接口实现。


package com.maimai.util;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map;import java.util.Set;import net.sf.json.JSONObject;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.HttpException;import org.apache.commons.httpclient.methods.GetMethod;import com.maimai.db_bean.AccessRecord;/** * 描述:httpclient发送get请求,从淘宝ip库,获取ip归属地 * 日期:2015-3-27 * @author sam * */public class HttpClientUtil {public static <T> T send(Class<T> c,String url) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException{return json2Object(c,fromObject(getMethod(url)));}public static String getMethod(String url){HttpClient httpclient = new HttpClient();GetMethod getMethod = new GetMethod(url);String jsonStr = "";try {int status = httpclient.executeMethod(getMethod);if(status == 200){jsonStr = getMethod.getResponseBodyAsString();}} catch (HttpException e) {System.out.println("Please check your provided http address!");e.printStackTrace();} catch (IOException e) {System.out.println("the line is wrong!");e.printStackTrace();} finally {getMethod.releaseConnection();// 释放链接}return jsonStr;}public static JSONObject fromObject(String jsonStr){JSONObject object = null;if(!"".equals(jsonStr)){try {object = JSONObject.fromObject(jsonStr);object = JSONObject.fromObject(object.get("data"));} catch (Exception e) {e.printStackTrace();}}return object;}public static <T> T json2Object(Class<T> c,JSONObject object) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException{Set<?> keySet = object.keySet();T obj = c.newInstance();Method[] methods = c.getDeclaredMethods();Map<String, Method> methodMap = new HashMap<String, Method>();for (Method m : methods) {methodMap.put(m.getName(), m);}for (Object o : keySet) {String propertyName = o.toString();String methodName = propertyName.substring(0, 1).toUpperCase()+ propertyName.substring(1);Method method = methodMap.get("set" + methodName);if (Util.isNullOrEmpty(method)) {continue;}String typeStr = method.getParameterTypes()[0].getName();if (typeStr.equals("java.lang.String")) {method.invoke(obj, object.get(propertyName));} else if (typeStr.equals("int") || typeStr.equals("int")) {method.invoke(obj, Integer.parseInt(object.get(propertyName).toString()));} else if (typeStr.equals("java.lang.Long") || typeStr.equals("long")) {method.invoke(obj, Long.parseLong(object.get(propertyName).toString()));} else if (typeStr.equals("java.lang.Double") || typeStr.equals("double")) {method.invoke(obj, Double.parseDouble(object.get(propertyName).toString()));} else if (typeStr.equals("java.lang.Float") || typeStr.equals("float")) {method.invoke(obj, Float.parseFloat(object.get(propertyName).toString()));}}return obj;}}


0 0