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)了,如下图:
不过这个代理有点怪,怎么访问页面成下载了?没关系,代理的基本原理就是这样了。
相关阅读
评论:
↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑