java如何实现http代理服务器

tomcat可以提供web服务,那他是否可以做代理服务器使用?

用Servlet好像可以,是的,我实验成功了,下面是代码。

建一个普通的web应用,配置web.xml

<servlet>
    <servlet-name>proxy</servlet-name>
    <servlet-class>net.highersoft.proxy.ProxyServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>proxy</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
这个代理类就是个Servlet:

package net.highersoft.proxy;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

public class ProxyServlet extends HttpServlet {
	private static Log log = LogFactory.getLog(ProxyServlet.class);
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private static List<String> filterUrls = Arrays.asList("highersoft.net");

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse rsp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		Map<String, String> headMap = new HashMap<String, String>();
		List<NameValuePair> paramList = new ArrayList<NameValuePair>();

		log.debug("---------start------------");
		log.debug("path:" + req.getServletPath()+" url:"+req.getRequestURL());
		log.debug("heads:");

		Enumeration<String> enumer = req.getHeaderNames();
		while (enumer.hasMoreElements()) {
			String name = enumer.nextElement();
			log.debug(name + ":" + req.getHeader(name));
			// Content-Length会被重置
			if (!"content-length".equals(name)) {
				headMap.put(name, req.getHeader(name));
			}
		}

		log.debug("params:");
		Enumeration<String> enumeration = req.getParameterNames();
		while (enumeration.hasMoreElements()) {
			String name = enumeration.nextElement();
			log.debug(name + ":" + req.getParameter(name));
			NameValuePair nvp = new BasicNameValuePair(name, req.getParameter(name));
			paramList.add(nvp);
		}

		// http://api.yimiyuedu.cn/courseware/getChapterList

		String host = req.getHeader("host");

		if (host != null) {
			if (host.startsWith("localhost")) {
				return;
			}
			for (String url : filterUrls) {
				if (host.indexOf(url) != -1) {
					System.out.println("url:" + req.getRequestURL());

				}
			}
		}

		InputStream rspVal = null;
		try {
			rspVal = HttpUtils.postHeader(req.getRequestURL().toString(), paramList, headMap);
		} catch (Exception e) {
			/*
			 * if(e instanceof SocketTimeoutException) {
			 * log.info(req.getRequestURL().toString()+""+e.getMessage()); }else {
			 * log.error(e.getMessage(),e);
			 * 
			 * }
			 */
			return;
		}

		// rsp.getOutputStream().println(new
		// String(rspVal.getBytes("UTF-8"),"ISO-8859-1"));

		if (rspVal != null) {
			int ch;
			while ((ch = rspVal.read()) != -1) {

				rsp.getOutputStream().write(ch);
			}
		}

		rsp.getOutputStream().flush();
		// return;

		// super.service(req, rsp);

		// req.getSession().getId()
	}

}

如果是我们关心的域名,打印一下他的详细信息。

启动tomcat后,把这个放进入ROOT,如果配的是8080端口。

那么就可以在firefox等浏览器配置代理(localhost:8080)了,如下图:


不过这个代理有点怪,怎么访问页面成下载了?没关系,代理的基本原理就是这样了。


文/程忠 浏览次数:0次   2020-08-17 09:53:27

相关阅读


评论:
点击刷新

↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑