java實現反向代理服務器
阿新 • • 發佈:2017-12-13
response connect enc char exception pos httputil let commons
1.寫的一個簡單的例子
package forword; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; @WebFilter("/*") public class ProxyFilter implements Filter { public ProxyFilter() { } public void destroy() { }public void doFilter(ServletRequest request1, ServletResponse response1, FilterChain chain1) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) request1; HttpServletResponse response = (HttpServletResponse) response1; request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); String basePath = request.getScheme() + "://" + "127.0.0.1:9080"; String locationUrl = basePath + request.getRequestURI(); String queryValue = request.getQueryString(); if (StringUtils.isNotBlank(queryValue)) { locationUrl += "?" + queryValue; } IOUtils.write(HttpUtils.sendGet(locationUrl, request), response.getOutputStream()); } public void init(FilterConfig fConfig) throws ServletException { } @SuppressWarnings("unused") private String solveUrl(HttpServletRequest request) { return request.getRequestURI().replaceAll(request.getContextPath(), ""); } public static void main(String[] args) { } }
思路如下:
1.首先所以的請求都必須要經過代理服務器,有代理服務器根據相應的規則(自定義),選擇合適的目標服務器進行轉發,
2.轉發的實現,我們可以自己去創建HttpURLConnection 連接到目標服務器獲取數據,也可以采用成熟的httpclient 去請求數據
3.將數據響應回去.
實現難點: 苦難的地方主要是在對http協議的解析,在這裏我使用了httpclient 來屏蔽這些底層的實現,但是我們自己應該懂得如何解析http請求
解析請求的例子:
public class ParseUtils { public static byte[] readLine(InputStream in) throws IOException { ByteAppender appender = new ByteAppender(); int _data = -1; while(true) { int data = in.read(); if(data == -1) break; if(_data == ‘\r‘) { if(data == ‘\n‘) break; else { appender.append((byte)_data); appender.append((byte)data); } } if(data != ‘\r‘) { appender.append((byte) data); } _data = data; } return appender.getDatas(); } }
//解析傳遞過來的報文
private void parse_(Socket socket) throws IOException { InputStream in = socket.getInputStream(); byte[] firstLine = ParseUtils.readLine(in); if(firstLine.length == 0) { throw new HttpException("heart-beaten test from client side"); } messageHeader = new String(firstLine); parseHeaders(in); bodyInput = in; InetAddress address = socket.getInetAddress(); setClientHost(address.getHostAddress()); }
java實現反向代理服務器