1. 程式人生 > >java實現反向代理服務器

java實現反向代理服務器

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實現反向代理服務器