天天看點

ajax跨域請求解決方案

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;
	}
}