java实现反向代理服务器

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());
    }
时间: 2024-11-14 10:51:51

java实现反向代理服务器的相关文章

web服务器、应用服务器、web容器、反向代理服务器区别与联系

我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是Web服务器/Web容器/Web应用程序服务器/反向代理有点像四胞胎,在网络上经常一起出现.本文将带读者对这四个相似概念如何区分. 1. 一文看懂web服务器.应用服务器.web容器.反向代理服务器区别与联系 1.1. Web服务器概念与基本原理 1.1.1. Web服务器的历史 1.1.2. Web服务器工作原理 1.2. Web应用程序容器概念与基本原理 1.2.1. Web应用程序容器的由来 1.2.2. Web应用程序容器

两张图简说代理服务器和反向代理服务器

题记:今天给同事讲解代理服务器和反向代理服务器时,画了张图进行说明. 代理服务器通常分为两类,即转发代理(forward proxy)服务器和反向代理(reverse proxy)服务器.转发代理服务器又通常简称为代理服务器,我们常提到的代理服务器就指的是转发代理服务器. 转发代理服务器 普通的转发代理服务器是客户端与原始服务器之间的一个中间服务器.为了从原始服务器获取内容,客户端发送请求到代理服务器,然后代理服务器从原始服务器中获取内容再返回给客户端.客户端必须专门地配置转发代理来访问其他站点

Nginx配置文件(反向代理服务器)

Nginx不但是轻量级的Web服务器,还是一款出色的反向代理服务器软件,其配置文件如下: #user  nobody; worker_processes  1; #工作进程数 #error_log  logs/error.log; #error_log  logs/error.log  notice; #error_log  logs/error.log  info; #pid        logs/nginx.pid; events { worker_connections  1024; #

Nginx搭建反向代理服务器过程详解 - Windows

本文主要是Nginx做一个简单的反向服务器代理和静态文件缓存. 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器 我们就开始动手吧. 1. Vistudio 创建两个简单的 WebApplication (Web Forms),一个叫WebApplication1,一个叫 WebApplication2. 为了区别

squid正向代理和反向代理服务器搭建

squid是比较知名的代理软件,它不仅可以跑在Linux上还可以跑在Windows和UNIX上,它的技术已经非常成熟.目前使用squid的用户也十分广泛.squid与Linux下其他的代理软件如Apache.socks.TIS FWTK等相比,下载安装简单,配置简单灵活,支持缓存和多种协议. squid之所以用的很多,是因为它的的缓存功能,squid的缓存不仅可以节省宝贵的带宽资源,也可以大大降低服务器的I/O.从经济角度考虑,它是很多网站架构中不可或缺的角色. squid可以做正向代理,也可以

代理服务器与反向代理服务器的区别

说到代理服务器,大部分人都应该比较熟悉了.记得在学校的时候因为校园网无法访问国外网站,因此经常使用代理来访问国外的网站.但是提到反向代理服务器可能大部分人就比较陌生,对于一般的代理服务器与反向代理服务器的区别估计也不是那么清楚. 因工作需要就研究了一下,搞清了是怎么回事,这里做个笔记,也为大家所共享. 代理服务器通常分为两类,即转发代理(forward proxy)服务器和反向代理(reverse proxy)服务器.转发代理服务器又通常简称为代理服务器,我们常提到的代理服务器就指的是转发代理服

反向代理服务器的工作原理

最近有打算研读nginx源代码,看到网上介绍nginx可以作为一个反向代理服务器完成负载均衡.所以搜罗了一些关于反向代理服务器的内容,整理综合. 一  概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器:并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器. 通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接

【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器

一.反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器. 从上图可以看出:反向代理服务器位于网站机房,代理网站Web服务器接收Http请求,对请求进行转发. 1.2 反向代理的作用 ①保护网站安全:任何来自Internet的请求都必须先经过代理服务器: ②通

Nginx作为反向代理服务器

前言:Nginx通过proxy模块实现反向代理功能.在作为web反向代理服务器时,nginx负责接收客户请求,并能够根据URI.客户端参数或其它的处理逻辑将用户请求调度至上游服务器上(upstream server).nginx在实现反向代理功能时的最重要指令为proxy_pass,它能够将location定义的某URI代理至指定的上游服务器(组)上.如下面的示例中,location的/uri将被替换为上游服务器上的/newuri. 实验环境: 192.168.2.168 nginx 192.1