在Java / Spring Boot中实现转发代理

时间:2017-02-01 02:20:45

标签: spring-mvc spring-boot proxy java-8 servlet-filters

我有兴趣通过使用Java 8和Spring Boot构建我自己的(简单)转发代理来了解有关HTTP以及代理如何工作的更多信息。我读过的文章(我有兴趣实施)是here。我感兴趣的主要三个前向代理功能是:

  • 资源缓存:如果以前访问过静态资源(CSS,JS,媒体文件等),我们可以直接从代理的本地(文件系统)中获取它高速缓存
  • 用户跟踪/审核:我们可以检查HTTP标头,以查看谁向哪些目标网址发出请求,并将这些访问记录写入日志
  • 内容过滤:网址过滤,可能会检查目标网站的响应并防止恶意软件下载等。

此处的目标是将此代理构建为Spring Boot应用程序,在本地运行,然后配置浏览器以使用此本地代理。最终我会将它部署到非本地环境,但首先要先将它部署。

我并不真正关心这些功能的实现细节 - 我可以弄清楚如何编写/实现它们。我想知道的是:提供这些类型的功能的最佳Spring / JavaEE构造是什么? Java EE servlet过滤器?弹簧控制器?其他一些(也许是基于AOP的)构造?

同样,这个想法是为了:

  1. 我将浏览器配置为点击本地代理,例如http://localhost:8080/myproxy
  2. 在我的浏览器中,我访问了一个网站,例如http://example.com
  3. 浏览器将HTTP请求(http://example.com)传递给代理,再次在http://localhost:8080/myproxy
  4. 运行
  5. 代理(取决于所使用的构造/机制及其配置的行为)可能会也可能不会检查/执行此请求
    • 例如,如果代理配置为充当静态资源的缓存,它可能会检查请求以查看它是否请求先前已缓存的文档(JS文件,CSS文件,IMG文件等) 。如果是对缓存文档的请求,我们可以短路(完全绕过目标站点)并将响应(文件)发送回浏览器
  6. 代理将目标网站(http://example.com)转发(或制作全新的 ??? )请求
  7. 目标站点向代理发回HTTP响应
  8. 代理(取决于所使用的构造/机制及其配置的行为)可能会也可能不会使用此响应检查/执行操作
    • 例如,如果代理已配置为扫描恶意软件,我们可能会检查二进制数据的响应,如果检测到,则将二进制响应发送给某些第三方扫描工具进行通过/未通过分析等
  9. 代理将HTTP响应发送回浏览器
  10. 我倾向于使用servlet过滤器或Spring控制器方法,但不确定哪种方法适合于呈现这些类型的功能。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

出于学习目的,您可能希望避免使用Spring,而只需要实现一个简单的HttpServlet。从那里你可以检查HttpServletRequest对象做任何事情,包括转发它。您可以在servlet本身中实现缓存逻辑,但是,添加一个使用缓存行为增强servlet的ServletFilter可能是有意义的。