ProxyServlet代理

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Pattern;

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

import org.apache.commons.lang.StringUtils;

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

	/**
	 * 对servlet进行请求处理,并将结果在指定输出流中输出
	 * 
	 * @param os
	 * @param servletName
	 * @param parm
	 * @throws IOException
	 * @throws MalformedURLException
	 */
	private void process(HttpServletRequest req, HttpServletResponse resp,
			String[] target) throws MalformedURLException, IOException {
		// 取得连接
		HttpURLConnection huc = (HttpURLConnection) new URL(url + target[0])
				.openConnection();

		// 设置连接属性
		huc.setDoOutput(true);
		huc.setRequestMethod("POST");
		huc.setUseCaches(false);
		huc.setInstanceFollowRedirects(true);
		huc.setRequestProperty("Content-Type",
				"application/x-www-form-urlencoded");
		huc.connect();

		// 往目标servlet中提供参数
		OutputStream targetOS = null;
		try {
			targetOS = huc.getOutputStream();
			targetOS.write(target[1].getBytes());
	        targetOS.flush();
	        targetOS.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		// 取得页面输出,并设置页面编码及缓存设置			
		int r;
		String cb = req.getParameter("callback");

		resp.setContentType(huc.getContentType());
		resp.setHeader("Cache-Control", huc.getHeaderField("Cache-Control"));
		resp.setHeader("Pragma", huc.getHeaderField("Pragma"));
		resp.setHeader("Expires", huc.getHeaderField("Expires"));
		resp.setStatus(huc.getResponseCode());
		
		// 将目标servlet的输入流直接往页面输出		
		try {			
			OutputStream os = resp.getOutputStream();        
			InputStream targetIS = huc.getInputStream();
			if(cb!=null){
				os.write((cb + "(").getBytes());
			}
			while ((r = targetIS.read()) != -1) {
				os.write(r);
			}
			if(cb!=null){
				os.write((")").getBytes());
			}
			targetIS.close();			
			os.flush();
			os.close();			
			huc.disconnect();
		} catch (IOException e) {
			// TODO: handle exception			
			resp.sendError(huc.getResponseCode());
			huc.disconnect();
		}
	}

	/**
	 * 将参数中的目标分离成由目标servlet名称和参数组成的数组
	 * 
	 * @param queryString
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	private String[] parse(Map map) throws UnsupportedEncodingException {
		String[] arr = { "", "" };
		Pattern pattern = Pattern.compile("^_[0-9]+$");
		Iterator iter = map.entrySet().iterator();
		while (iter.hasNext()) {
			Map.Entry me = (Entry) iter.next();
			String[] varr = (String[]) me.getValue();
			if (!(StringUtils.equals("callback", me.getKey().toString()) )) {
				if( !((pattern.matcher(me.getKey().toString())).find())){				
					if ("servletName".equals(me.getKey())) {
						// 取出servlet名称
						arr[0] = varr[0];
					} else {
						// 重新组装参数字符串
						for (int i = 0; i < varr.length; i++) {
							// 参数需要进行转码,实现字符集的统一
							arr[1] += "&" + me.getKey() + "="
									+ URLEncoder.encode(varr[i], "utf-8");
						}
					}
				}
			}
		}
		arr[1] = arr[1].replaceAll("^&", "");
		return arr;
	}

	@Override
	public void init() throws ServletException {
		// 设置目标服务器地址
		url = this.getInitParameter("url");
		if (!url.endsWith("/"))
			url = url + "/";
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		this.doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String[] target = parse(req.getParameterMap());
		process(req, resp, target);
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值