Tomcat 中的 WEB 应用如何使用代理向外部发起请求

一直使用的阿里云ECS,经典网络类型。为什么不采用典型的专有网络 VPC 呢?因为考虑到成本嘛,而且也没有人来专门规划整个网络的,所以就采用最简单的经典网络,每台主机各自为政,都有自己的公网、私网出口,互不影响。

通过这种方式,发现有的服务器根本不需要外网带宽,比如负载均衡后面的服务器,因为负载均衡都是通过内网传输数据的,所以公网带宽完全就闲置起来了,而且暴露在公网中也比较危险。所以我们就开始购入没有公网IP的经典网络ECS。然后就遇到了下面的各种问题。

阿里云没有购买公网的情况下,不分配公网IP,也不能访问外网的资源,只能访问在同一个机房里面的服务器内网IP。这可怎么办呢?我们有些业务服务器是需要和外网进行交互的,比如进行资源加速的时候,是需要和CDN厂商服务器进行连接的,为了解决这个问题。我们在该机房中购买了一台公网带宽比较大的服务器,作为访问外网的代理服务器,安装了HTTP代理服务软件(记住哦,自己架设的代理服务器一定要设置密码,而且必须是强密码,不然一两天之类就会被整崩溃的。)

现在就开始把以前老的应用程序迁移到这台只有内网访问权限的服务器上,现在这台内网服务器上设置全局的HTTP代理信息,刚开始迁移PHP程序的时候,没任何问题,因为会自动根据系统的代理信息进行连接,但是Java web程序貌似走不通哎。现在重点讲 Java web如何使用代理程序进行连接。

前置条件:Tomcat VM 设置参数:

-Dhttp.proxyHost=10.0.0.1 -Dhttp.proxyPort=1234

我分析了以下几种情况

  1. 使用jdk里面自带的库进行请求的时候,会自动根据VM参数进行连接。没有使用第三方库,详细代码参见:

 1  private static String sendGetByDefault(String url, String param) {
 2         String result = "";
 3         BufferedReader in = null;
 4         try {
 5             String urlNameString = url + "?" + param;
 6             URL realUrl = new URL(urlNameString);
 7             // 打开和URL之间的连接
 8             URLConnection connection = realUrl.openConnection();
 9             // 设置通用的请求属性
10             connection.setRequestProperty("accept", "*/*");
11             connection.setRequestProperty("connection", "Keep-Alive");
12             connection.setRequestProperty("user-agent",
13                     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
14             // 建立实际的连接
15             connection.connect();
16             // 获取所有响应头字段
17             Map<String, List<String>> map = connection.getHeaderFields();
18             // 遍历所有的响应头字段
19             for (String key : map.keySet()) {
20                 System.out.println(key + "--->" + map.get(key));
21             }
22             // 定义 BufferedReader输入流来读取URL的响应
23             in = new BufferedReader(new InputStreamReader(
24                     connection.getInputStream()));
25             String line;
26             while ((line = in.readLine()) != null) {
27                 result += line;
28             }
29         } catch (Exception e) {
30             System.out.println("发送GET请求出现异常!" + e);
31             e.printStackTrace();
32         }
33         // 使用finally块来关闭输入流
34         finally {
35             try {
36                 if (in != null) {
37                     in.close();
38                 }
39             } catch (Exception e2) {
40                 e2.printStackTrace();
41             }
42         }
43         return result;
44     }

  2. 使用Apache提供的第三方库,不会根据VM参数进行连接,maven信息参见:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.1</version>
</dependency>

   详细代码参见:

 private static String sendGetByApache(String url, String param) {
        StringBuilder buffer = new StringBuilder();

        DefaultHttpClient client = new DefaultHttpClient();
        try {
            HttpGet get = new HttpGet(url);
            HttpResponse response = client.execute(get);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));
                String str;
                while ((str = br.readLine()) != null) {
                    buffer.append(str);
                }
                br.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            client.getConnectionManager().shutdown();
        }

        return buffer.toString();
    }

  3. 使用Unirest库进行请求,不会根据VM代理信息进行连接,maven 信息参见:

<dependency>
    <groupId>com.mashape.unirest</groupId>
    <artifactId>unirest-java</artifactId>
    <version>1.4.7</version>
</dependency>     

  详细代码参见:

 private static String sendGetByUnirestClient(String url, String param) {
        com.mashape.unirest.http.HttpResponse<String> res;
        try {
            res = Unirest.get("http://baidu.com")
                    .queryString("name", "Mark")
                    .asString();
        } catch (UnirestException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

        return res.getBody();
    }

  综上所述,基本上使用第三方库的都不会自动使用系统代理,所以我们要对程序进行一下改造。我们建议使用Unirest,因为他提供多种语言的HTTP请求库,并且风格一致,有利于不同语言之间的协作。

  

时间: 2024-12-20 17:48:42

Tomcat 中的 WEB 应用如何使用代理向外部发起请求的相关文章

在Tomcat中部署Web应用的方式

在Tomcat中部署Web应用的方式有以下几种: 利用Tomcat的自动部署 将一个Web应用复制到Tomcat的webapps下,系统将会把该应用部署到Tomcat中.这是最简单.最常用的方式. 利用控制台部署 启动Tomcat,在命令行执行窗口中,cd D:\Program Files\Java\apache-tomcat-8.0.23\bin,然后startup.bat 浏览器登录http://localhost:8080 进入Manager App控制台(需要在D:\Program Fi

Linux服务器上的tomcat中部署web项目

首先了解一下下面几个概念,讲得不太准确: 1.JVM JVM是class以及jar(实际上就是很多个class压缩在一起)的运行环境,特征就是java和javaw命令,通过这两个命令,你可以执行class和jar文件.你可以通过-classpath参数指定你需要加载的jar文件 2.JDK JDK就是JAVA的命令行开发环境,内置了JVM,特征就是javac命令,这个命令允许你将.java源文件批量或者单个编译成.class文件,从而可以通过JVM的java命令执行.在编译时你可以通过-clas

Tomcat中部署web应用 ---- Dubbo服务消费者Web应用war包的部署

IP:192.168.2.61 部署容器:apache-tomcat-7.0.57 端口:8080 应用:edu-web-boss.war 1.下载(或上传)最新版的Tomcat7: $wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.57/bin/apache-tomcat-7.0.57.tar.gz 2.规范安装目录: /home/wusc/edu/web/xxx-tomcat 如: /home/wusc/edu/web/

CXF实战之在Tomcat中公布Web Service(二)

服务接口及实现类请參考WebService框架CXF实战(一) 创建Maven Web项目,在pom.xml中加入CXF和Spring Web的引用,因为CXFServlet须要Spring Web的支持. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&quo

为啥tomcat中的web应用停了,线程还在跑

https://www.cnblogs.com/lixiaojiao-hit/p/5095180.html “静态变量是ClassLoader级别的,如果web应用程序停止,这些静态变量也会从jvm中清除.但是线程则是JVM级别的,如果用户在web应用中启动一个线程,这个线程的生命周期并不会和web应用程序保持同步.也就是说,即使停止了web应用,这个线程也依旧是活跃的.” 只要tomcat没停止,jvm没停止,java进程也还在,而只是web应用停止了而已.这样线程当然也就还在了. 这个解决了

在Docker容器中部署Web应用

本文直接讲解如何在Docker容器中实战部署一个Web应用程序,关于Docker相关的概念和如何安装Docker请参考相关资料完成. 第一步:工具准备 演示如何在Docker容器中部署一个Java Web应用程序,需要准备的软件工具包括:jre,tomcat和webapp应用.另外,为了实现在容器启动时自动启动webapp,需要编写一个脚本工具完成该工作. 安装jre,请参考:http://www.wikihow.com/Install-Java-on-Linux 安装tomcat,请参考:ht

Eclipse中Maven WEB工程tomcat调试

http://blog.csdn.net/clj198606061111/article/details/20221133 ********************************************** 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近没事了玩一下maven,使用maven管理工程中的依赖包非常的方便.建立maven web工程的时候开始不知道怎么用tomcat来调试,总是使用mave的tomcat插件发布了后来调试,觉得非常的麻烦,网上找了点材料,看看m

[转]Eclipse中的Web项目自动部署到Tomcat

原文地址:http://www.cnblogs.com/ywl925/p/3815173.html 原因 很长时间没用Eclipse了,近期由于又要用它做个简单的JSP项目,又要重新学习了,虽然熟悉的很快,但记忆总是很模糊,偶尔犯错,以前很少写 博客,现在感觉还是很有必要的,编程中每个人对于犯过的错误,解决后不再使用的话,很长时间重新使用,还是会犯同样的错误.(这是人,编程环境,思维方式 共同决定给的) 问题 这里就有个问题,是怎么把Eclipse中的网站项目自动部署到tomcat中.在Ecli

Eclipse中的Web项目自动部署到Tomcat

一.原因. 1.写java程序有一段时间了,但很久没用eclipse了,所以使用eclipse编写的web项目部署到tomcat 的方式也不是很清楚,下面记录一下将Eclipse 上的web项目自动部署到tomcat 上的方式: 二.部署问题 1.这里就有个问题,是怎么把Eclipse中的网站项目自动部署到tomcat中.在Eclipse中做的Web项目默认是不支持将项目发布到Web服务器上的,会发布到工作空间的某个目录下,因此无法在外部启动Tomcat来运行Web项目,只有打开Eclipse中