`

Ajax 跨域代理

阅读更多

使用了httpclient做代理请求。

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import jef.database.Condition.Operator;
import jef.database.QB;
import jef.database.query.Query;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIUtils;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import com.ailk.easyframe.web.common.exception.BusinessException;
import com.ailk.so.redo.MessageCode;
import com.ailk.so.redo.constants.Constants;
import com.ailk.so.redo.persistence.paramconf.entity.SoRedoParam;
import com.ailk.so.redo.service.paramconf.SoRedoParamService;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
@Transactional
public class AjaxProxyServiceImpl extends AjaxProxyServiceSkeleton implements AjaxProxyService{


	private Log log = LogFactory.getLog(AjaxProxyServiceImpl.class);

	@Autowired
	protected SoRedoParamService paramconf_soRedoParamService;

	public void setParamconf_soRedoParamService(SoRedoParamService obj){
		this.paramconf_soRedoParamService = obj;
	}

	public Map<String, Object> doRequest(Map<String,String> requestParams) {
		Map<String, String> dbParamMap = getDBParamMap(requestParams);
		/** 得到url参数*/
		String requestUrl = dbParamMap.get(requestParams.get(Constants.REQUEST_URL_KEY));
		if(requestUrl == null) {
			BusinessException ex =  new BusinessException(MessageCode.E1013);
			log.error(ex.getFormattedMessage());
			throw ex;
		}
		log.info("requestUrl:" + requestUrl);
		/** 建立一个NameValuePair数组,用于存储欲传送的参数*/
		List<NameValuePair> qparams = new ArrayList<NameValuePair>();
		HttpClient hc = new DefaultHttpClient();
		/** 给数组加入参数*/
		if(requestParams != null && !requestParams.isEmpty()) {
			Set<Entry<String, String>> pSet = requestParams.entrySet();
			for(Entry<String, String> entry : pSet) {
				String key = entry.getKey();
				String value = entry.getValue();
				if(log.isDebugEnabled()) {
					log.debug("request param " + key + ":" + value);
				}
				if(Constants.REQUEST_URL_KEY.equals(key)) {
					continue;
				}
				//优先查询参数表,如果请求的code在参数表有配置,则用参数表的配置,否则直接使用页面传过来的值
				if(Constants.REQUEST_CODE_KEY.equals(key)) {
					String codeValue = dbParamMap.get(value);
					if(codeValue == null || codeValue.trim().length() == 0) {
						log.info("can not found job code in db by key:" + key);
						codeValue = value;
					}
					qparams.add(new BasicNameValuePair(key, codeValue));
					continue;
				}
				qparams.add(new BasicNameValuePair(key, value));
			}
		}
		
		HttpResponse response;
		try {
			/** 创建url对象并设置编码等属性*/
			URL url = new URL(requestUrl);
			URI uri = URIUtils.createURI(url.getProtocol(), url.getHost(),
					url.getPort(), url.getPath(),
					URLEncodedUtils.format(qparams, "UTF-8"), null);
			/** 创建一个get请求对象*/
			HttpGet httpget = new HttpGet(uri);
			/** 发送get请求,并返回一个HttpResponse对象*/
			response = hc.execute(httpget);
			HttpEntity entity = response.getEntity();
			StringBuffer responseTxtSb = new StringBuffer();
			/** 将返回值得到并放入stringBuffer中*/
			if (entity != null) {
			    InputStream instream = entity.getContent();
			    int len;
			    byte[] tmp = new byte[2048];
			    while ((len = instream.read(tmp)) != -1) {
			    	if(len < 2048) {
			    		byte[] last = new byte[len];
			    		System.arraycopy(tmp, 0, last, 0, len);
			    		responseTxtSb.append(new String(last));
			    	} else {			    	
			    		responseTxtSb.append(new String(tmp));
			    	}
			    }
			    String responseTxt = responseTxtSb.toString();
			    log.info("ajax proxy response:" + responseTxt);
			    /** 解析返回值字符串*/
			    if(responseTxt.length()  != 0) {
			    	Type type = new TypeToken<ProxyResponse>() {}.getType();
			    	ProxyResponse result =  new Gson().fromJson(responseTxt, type);
			    	String urlKey = requestParams.get(Constants.REQUEST_URL_KEY);
			    	if(!urlKey.equals("check_status_url")) {
			    		if(!result.getSuccess()) {
			    			throw new BusinessException(-1, result.getMessage());
			    		}
			    	} else {
			    		if(!result.getSuccess()) {
			    			log.error("check job status error.");
			    			return null;
			    		}
			    	}
			    	Object data = result.getData();
			    	Integer tatal = result.getTotal();
			    	
			    	Map<String, Object> resultMap = new HashMap<String, Object>();
			    	if(data  != null) {
			    		resultMap.put("data",  data);
			    	}
			    	if(tatal != null) {
			    		resultMap.put("tatal",  tatal);
			    	}
			    	
			    	if(!resultMap.isEmpty()) {
			    		return resultMap;
			    	}
			    	return null;
			    }
			}
		} catch (ClientProtocolException ce) {
			log.error(ce.getMessage());
			ce.printStackTrace();
			throw new BusinessException(-1, ce.getMessage());
		} catch (IOException ie) {
			log.error(ie.getMessage());
			ie.printStackTrace();
			throw new BusinessException(-1, ie.getMessage());
		} catch (URISyntaxException ue) {
			log.error(ue.getMessage());
			ue.printStackTrace();
			throw new BusinessException(-1, ue.getMessage());
		}
		return null;
	}

	private Map<String, String> getDBParamMap(Map<String,String> requestParams) {
		String urlKey = requestParams.get(Constants.REQUEST_URL_KEY);
		String code = requestParams.get(Constants.REQUEST_CODE_KEY);
		if(urlKey == null || urlKey.trim().length() == 0) {
			throw new BusinessException(MessageCode.E1012);
		}
		
		List<SoRedoParam> paramList = getParamList(Constants.AJAX_PROXY_PARAM_TYPE, urlKey,code);
		Map<String, String> paramMap = new HashMap<String, String>();
		for(SoRedoParam param : paramList) {
			log.info("ajax request info:" + param.getParamName() + "=" + param.getParamValue());
			paramMap.put(param.getParamName(), param.getParamValue());
		}
		return paramMap;
	}

	private List<SoRedoParam> getParamList(String paramType, String... paramNames) {
		Query<SoRedoParam> paramQuery = QB.create(SoRedoParam.class);
		paramQuery.addCondition(SoRedoParam.Field.paramType, paramType);
		if(paramNames == null) {
			log.error("param name is null");
			return null;
		}
		paramQuery.addCondition(SoRedoParam.Field.paramName, Operator.IN, paramNames);
		List<SoRedoParam> paramList = paramconf_soRedoParamService.find(paramQuery.getInstance());
		
		if(paramList == null || paramList.size() == 0) {
			String errMsg = "not found param value by param name:" +paramNames;
			log.error(errMsg);
			throw new BusinessException(MessageCode.E1000, errMsg);
		}
		return paramList;
	}


	class ProxyResponse {
		/**成功标记*/
		private Boolean success;	
		/**错误对象 */
		private String message;
		/**待传输数据*/
		private Object data;
		/**数据总数 当返回结果为数组时*/
		private Integer total;
		
		public Boolean getSuccess() {
			return success;
		}
		public void setSuccess(Boolean success) {
			this.success = success;
		}
		public String getMessage() {
			return message;
		}
		public void setMessage(String message) {
			this.message = message;
		}
		public Object getData() {
			return data;
		}
		public void setData(Object data) {
			this.data = data;
		}
		public Integer getTotal() {
			return total;
		}
		public void setTotal(Integer total) {
			this.total = total;
		}
	};


}
分享到:
评论

相关推荐

    ajax跨域解决办法

    【AJAX跨域解决办法】 在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种在无需刷新整个页面的情况下更新部分网页的技术。然而,由于浏览器的同源策略限制,AJAX请求通常只能发送到与当前页面同一源的...

    Javascript跨域和Ajax跨域解决方案

    JavaScript跨域和Ajax跨域是Web开发中常见的问题,尤其在进行前后端分离或API调用时,由于浏览器的同源策略限制,不同域名、协议或端口的资源请求会被阻止,这就是所谓的“跨域”。本文将深入探讨JavaScript和Ajax...

    Ajax跨域详解与代码

    **Ajax跨域详解** 在Web开发中,Ajax(Asynchronous JavaScript and XML)技术允许我们实现页面的异步更新,无需刷新整个页面即可获取并展示新数据。然而,由于浏览器的安全策略,同一源策略(Same-Origin Policy)...

    Ajax跨域访问解决方案

    **Ajax跨域访问解决方案** 在Web开发中,Ajax(Asynchronous JavaScript and XML)技术被广泛用于实现页面的异步更新,提升用户体验。然而,由于浏览器的同源策略限制,Ajax请求只能向同源(协议、域名和端口相同)...

    解决ajax跨域问题

    为了解决AJAX跨域问题,开发者可以采用以下几种策略: 1. JSONP(JSON with Padding) JSONP是一种绕过同源策略的方法,它利用了`&lt;script&gt;`标签不受同源策略限制的特点。JSONP的工作原理是服务器提供一个可被调用的...

    解决ajax跨域请求问题

    在Web开发中,Ajax(Asynchronous ...总之,解决Ajax跨域问题需要对同源策略有深入理解,并灵活运用JSONP、CORS、代理服务器等技术。在实际操作中,根据项目需求和安全性考虑选择合适的方法,确保跨域请求的顺利进行。

    IE7 Ajax跨域问题

    标题 "IE7 Ajax跨域问题" 涉及到的是在使用Ajax技术在Internet Explorer 7(IE7)浏览器中处理跨域请求时遇到的挑战。在Web开发中,Ajax(Asynchronous JavaScript and XML)是一种在不刷新整个页面的情况下与服务器...

    Ajax跨域提交

    Ajax跨域提交是Web开发中的一个重要概念,它涉及到前端JavaScript与后端服务器之间的异步数据交互,特别是当这种交互跨越了不同的源(域名、协议或端口)时。在了解Ajax跨域提交前,我们首先需要理解Web浏览器的同源...

    怎样实现Ajax 跨域访问

    ### 如何实现Ajax跨域访问 在Web开发中,由于同源策略的限制,JavaScript只能对同源的页面进行操作,不能对不同源的页面进行请求。然而,在实际的应用场景中,经常会出现需要向不同域名下的服务器发起请求的情况。...

    Ajax通过代理跨域访问

    本文将详细探讨两种主要的Ajax跨域访问解决方法:JSONP和CORS。 **1. JSONP(JSON with Padding)** JSONP是一种非官方的跨域数据交互协议,它利用了`&lt;script&gt;`标签不受同源策略限制的特点。JSONP的工作原理是:...

    ajax跨域获取数据

    但随着互联网应用的发展,这种需求变得越来越普遍,于是诞生了"ajax跨域获取数据"的技术解决方案。这个话题涵盖了多个关键知识点,包括同源策略、CORS(跨源资源共享)以及JSONP等。 1. 同源策略:同源策略是浏览器...

    Ajax跨域问题及其解决方案.docx

    ### Ajax跨域问题及其解决方案 #### 一、Ajax跨域问题概述 在现代Web开发中,前后端分离架构越来越流行。这种模式下,前端页面与后端服务通常部署在不同的服务器上,甚至可能位于不同的域名下。当浏览器发起对不同...

    ajax跨域问题的解决办法.rar

    本教程将详细探讨如何解决Ajax跨域问题。 一、同源策略 同源策略是浏览器为了保障用户安全而实施的一种机制,它限制了Web页面只能读取同源(协议+域名+端口相同)的资源。当Ajax尝试向不同源发送请求时,浏览器会...

    ajax跨域jar包.zip

    【标题】:“Ajax跨域问题解决方法——CORS详解及jar包使用” 【内容】: 在Web开发中,Ajax(Asynchronous JavaScript and XML)技术被广泛用于实现页面的异步更新,提高用户体验。然而,由于浏览器的安全策略,...

    Ajax跨域问题 解决方案

    ### Ajax跨域问题解决方案 #### 一、什么是Ajax跨域 **原理:** Ajax跨域问题的核心在于浏览器的“同源策略”。同源策略是一种安全措施,用于限制一个域名下的文档或脚本如何与另一个来源的资源进行交互。简单来说...

    Ajax跨域问题详细解读

    总结,Ajax跨域问题是Web开发中的常见挑战,理解并掌握JSONP、CORS以及代理服务器等解决策略,是提升Web应用性能和用户体验的关键。同时,安全始终是首要考虑,确保在提供跨域功能的同时,也要防止潜在的安全威胁。

    用代理避免ajax跨域请求(手机验证码)

    标题“用代理避免ajax跨域请求(手机验证码)”指出了解决这个问题的一种策略,即利用代理服务器来规避浏览器的同源策略限制。下面我们将深入探讨这个主题。 首先,我们了解什么是跨域请求。在Web开发中,由于...

    AJAX跨域实现的三种方式

    AJAX跨域是指在使用XMLHttpRequest (XHR) 进行AJAX请求时,由于浏览器的同源策略限制,导致不同源之间的通信受到阻碍。同源策略是浏览器为了保护用户安全而实施的一项机制,它禁止了一个源的文档或脚本去获取另一个...

Global site tag (gtag.js) - Google Analytics