通过ProxyServlet实现可编程的反向代理

说道反向代理,可能首先想到的就是nginx。不过在我们的需求中,对于转发过程有更多需求:

  • 需要操作session,根据session的取值决定转发行为

  • 需要修改Http报文,增加Header或是QueryString

第一点决定了我们的实现必定是基于Servlet的。jetty提供的ProxyServlet就可以满足我们的要求,ProxyServlet直接继承自HttpServlet,采用异步的方式调用内部服务器,因材效率上不会有什么问题,并且各种可重载的函数也提供了比较强大的定制机制。

首先确保当前Servlet版本到达3.1,这个版本才能提供ProxyServlet所要求的异步功能。jetty9搭载的Servlet版本就是3.1,构建的时候引用它就好。其次是在Servlet的配置中打开异步功能:


<servlet>
<servlet-name>proxyservlet</servlet-name>
<servlet-class>net.narcissu5.SimpleProxyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>

然后是实现我们的类,从ProxyServlet继承:


package net.narcissu5;

import org.eclipse.jetty.client.api.Request;
import org.eclipse.jetty.proxy.ProxyServlet;

import javax.servlet.http.HttpServletRequest;
import java.net.URI;
import java.net.URISyntaxException;

public class SimpleProxyServlet extends ProxyServlet {
@Override
protected Request addViaHeader(Request proxyRequest) {
proxyRequest.header("Basic","123456");
return super.addViaHeader(proxyRequest);
}

@Override
protected URI rewriteURI(HttpServletRequest request) {
URI uri = null;
try{
if(request.getQueryString() == null){
uri = new URI("http://192.168.235.129:8080");
} else {
uri = new URI("http://192.168.235.129:8080?" + request.getQueryString());
}
} catch (URISyntaxException e){

}
return uri;
}
}

当然rewriteURI中可以有更复杂的逻辑,既然都已经进入到了这里,转发规则就不是什么问题了。最后注意下jetty class
load的问题。jetty 9
使用JavaEE规范,先加载用户类再加载服务器类,因此引用的jetty-proxy.jar如果设置为provide(也就是不打包进入war)的话会出现ClassNotFound异常。通常的做法(感谢StackOverflow)是设置为编译时依赖:


<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-proxy</artifactId>
<version>9.1.5.v20140505</version>
</dependency>

这样它就普通的Servlet没什么区别了,虽然war最后会大那么一点点~~

通过ProxyServlet实现可编程的反向代理,布布扣,bubuko.com

时间: 05-09

通过ProxyServlet实现可编程的反向代理的相关文章

Nginx反向代理Tomcat,以及Session会话

一:Tomcat及JDK简介 1.)Tomcat是一个免费的web应用服务器服务器,国内很多大型站点也是采用Tomcat来构建的.Tomcat是apache基金会的一个核心项目,其运行环境需要JDK的支持,Tomcat都是基于某个版本的JDK平台所研发,版本不对称,会导致Tomcat启动失败. 2.)JDK于1996年开发第一个版本,JDK主要组建JVM,Applet,AWT等.JDK1.1的版本引入了JAR格式,用户打包Java程序代码.还引入了JDBC,Java通过驱动去连接数据库. 3.)

Nginx安装、性能测试、反向代理、负载均衡实例

一.nginx安装 我使用的环境是64位 Ubuntu 14.04.nginx依赖以下模块: l gzip模块需要 zlib 库 l rewrite模块需要 pcre 库 l ssl 功能需要openssl库 1.1.安装pcre l 获取pcre编译安装包,在http://www.pcre.org/上可以获取当前最新的版本 l 解压缩pcre-xx.tar.gz包. l 进入解压缩目录,执行./configure. l make & make install 1.2.安装openssl l 获

反向代理原理反向代理服务器配置解决访问加速

基本原理: 用户A始终认为它访问的是原始服务器B而不是代理服务器Z,但实用际上反向代理服务器接受用户A的应答,从原始资源服务器B中取得用户A的需求资源,然后发送给用户A.由于防火墙的作用,只允许代理服务器Z访问原始资源服务器B.尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了原始资源服务器B,但用户A并不知情. ps:简单的说,用户A所请求的和响应全由代理服务器Z和真实的服务器B做了代理工作 解决使用单线程下nginx反向代理服务器配置(网络资料提供参考,原文:http://www.jb

[转]反向代理过程与Nginx特点详解

原文链接:http://www.open-open.com/lib/view/open1417488526633.html 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器. 从上图可以看出:反向代理服务器位于网站机房,代理网站Web服务器接收Http请求,对请求进行转发. 1.2 反向代理

Nginx的反向代理及负载均衡

1.集群的简介 简单来说,集群就是指一组相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点都是运行各自服务的独立服务器.这些服务器之间可以彼此通信,协同向用户提供应用程序.系统资源和数据,并以单一系统的模式加以管理.当用户客户机请求集群系统时,集群给用户的感觉就是一个单一的服务器,而实际上用户请求的是一组集群服务器. 集群主要包括几大特点:高性能.价格有效性.可伸缩性.高可用性.透明性.可管理性和可编程性. 2.负载均衡集群 常见的负载均衡的架构包括有负载均衡集群.高

nginx反向代理cas应用实践(多地址跳转)

问题的提出:最近单位遇到一个需求,单位a和单位b,都通过专线连接到我单位,单位b提出需要访问单位a网络中的一个网站应用,本来很简单问题,只需要我单位中一台可以访问两边网络的服务器上,架设nginx就可以解决该问题,事实上,我天真了! (ps:本文仅针对对nginx反向代理有一定了解的朋友,如不了解请自行百度) 问题出现在这个网站应用上,他们使用了cas架构,在系统登录的url地址和应用的地址不在一起:如下 当使用系统的地址访问时,他跳转到下面的位置,显示了登录页面: 当登录系统后,又跳转回192

Linux系统——Nginx反向代理与负载均衡

集群集群是指一组(若干个)相互独立的计算机,利用高速通信网路组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运用各自服务的独立服务器.这些服务器之间可以彼此通信,协同向用户提供应用程序,系统资源和数据,并以单一系统的模式加以管理.当用户客户机请求集群系统时,集群给用户的感觉就是一个单一独立的服务器,而实际上用户请求的是一组集群服务器. 特点:(1)高性能用户通过Internet到公司的网关,网关通过防火墙,调载到前端的主负载均衡服务器上(有主有备,预防单点问题),主负载均

nginx详解反向代理、负载均衡、LNMP架构上线动态网站

nginx介绍 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的,它已经在该站点运行超过两年半了.Igor Sysoev在建立的项目时,使用基于BSD许可. nginx和apache区别 Nginx 轻量级,采用 C 进行编写,同样的 web 服务,会占用更

Nginx入门简介和反向代理、负载均衡、动静分离理解

场景 Nginx简介 Nginx ("engine x")是一个高性能的 HTTP 和反向代理服务器 特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 nginx网站用户有:百度.京东.新浪.网易.腾讯.淘宝等. Nginx可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl . php等.但是不支持 java . Java 程序只能通过与 tomcat 配合完成. Nginx 专为性能优化而