麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 網站 > Tomcat > 正文

詳解如何通過tomcat的ManagerServlet遠程部署項目

2024-09-06 19:00:56
字體:
來源:轉載
供稿:網友

介紹

之前在郵政實習時,leader讓我閱讀tomcat的源代碼,嘗試自己實現遠程部署項目的功能,于是便有了這此實踐。
在Tomact中有一個Manager應用程序,它是用來管理已經部署的web應用程序,在這個應用程序中,ManagerServlet是他的主servlet,通過它我們可以獲取tomcat的部分指標,遠程管理web應用程序,不過這個功能會受到web應用程序部署中安全約束的保護。

當你請求ManagerServlet時,它會檢查getPathInfo()返回的值以及相關的查詢參數,以確定被請求的操作。它支持以下操作和參數(從servlet路徑開始): 

請求路徑 描述
/deploy?config={config-url} 根據指定的path部署并啟動一個新的web應用程序(詳見源碼)
/deploy?config={config-url}&war={war-url}/ 根據指定的pat部署并啟動一個新的web應用程序(詳見源碼)
/deploy?path=/xxx&war={war-url} 根據指定的path部署并啟動一個新的web應用程序(詳見源碼)
/list 列出所有web應用程序的上下文路徑。格式為path:status:sessions(活動會話數)
/reload?path=/xxx 根據指定path重新加載web應用
/resources?type=xxxx 枚舉可用的全局JNDI資源,可以限制指定的java類名
/serverinfo 顯示系統信息和JVM信息
/sessions 此方法已過期
/expire?path=/xxx 列出path路徑下的web應用的session空閑時間信息
/expire?path=/xxx&idle=mm Expire sessions for the context path /xxx which were idle for at least mm minutes.
/sslConnectorCiphers 顯示當前connector配置的SSL/TLS密碼的診斷信息
/start?path=/xx 根據指定path啟動web應用程序
/stop?path=/xxx 根據指定path關閉web應用程序
/threaddump Write a JVM thread dump
/undeploy?path=/xxx 關閉并刪除指定path的Web應用程序,然后刪除底層WAR文件或文檔基目錄。

我們可以通過ManagerServlet中getPathInfo()提供的操作,將自己的項目遠程部署到服務器上,下面將貼出我的實踐代碼,在實踐它之前你只需要引入httpclient包和commons包。

封裝統一的遠程請求管理類

封裝此類用于方便client請求ManagerServlet:

import java.io.File;import java.net.URL;import java.net.URLEncoder;import org.apache.commons.io.IOUtils;import org.apache.commons.lang.StringUtils;import org.apache.http.Header;import org.apache.http.HttpHost;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.auth.AuthScope;import org.apache.http.auth.Credentials;import org.apache.http.auth.UsernamePasswordCredentials;import org.apache.http.client.AuthCache;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpRequestBase;import org.apache.http.client.protocol.ClientContext;import org.apache.http.impl.auth.BasicScheme;import org.apache.http.impl.client.BasicAuthCache;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.impl.conn.PoolingClientConnectionManager;import org.apache.http.protocol.BasicHttpContext;public class TomcatManager {  private static final String MANAGER_CHARSET = "UTF-8";  private String username;  private URL url;  private String password;  private String charset;  private boolean verbose;  private DefaultHttpClient httpClient;  private BasicHttpContext localContext;  /** constructor */  public TomcatManager(URL url, String username) {    this(url, username, "");  }  public TomcatManager(URL url, String username, String password) {    this(url, username, password, "ISO-8859-1");  }  public TomcatManager(URL url, String username, String password, String charset) {    this(url, username, password, charset, true);  }  public TomcatManager(URL url, String username, String password, String charset, boolean verbose) {    this.url = url;    this.username = username;    this.password = password;    this.charset = charset;    this.verbose = verbose;        // 創建網絡請求相關的配置    PoolingClientConnectionManager poolingClientConnectionManager = new PoolingClientConnectionManager();    poolingClientConnectionManager.setMaxTotal(5);    this.httpClient = new DefaultHttpClient(poolingClientConnectionManager);    if (StringUtils.isNotEmpty(username)) {      Credentials creds = new UsernamePasswordCredentials(username, password);      String host = url.getHost();      int port = url.getPort() > -1 ? url.getPort() : AuthScope.ANY_PORT;      httpClient.getCredentialsProvider().setCredentials(new AuthScope(host, port), creds);      AuthCache authCache = new BasicAuthCache();      BasicScheme basicAuth = new BasicScheme();      HttpHost targetHost = new HttpHost(url.getHost(), url.getPort(), url.getProtocol());      authCache.put(targetHost, basicAuth);      localContext = new BasicHttpContext();      localContext.setAttribute(ClientContext.AUTH_CACHE, authCache);    }  }  /** 根據指定的path部署并啟動一個新的應用程序 */  public TomcatManagerResponse deploy(String path, File war, boolean update) throws Exception {    StringBuilder buffer = new StringBuilder("/deploy");    buffer.append("?path=").append(URLEncoder.encode(path, charset));    if (war != null) {      buffer.append("&war=").append(URLEncoder.encode(war.toString(), charset));    }    if (update) {      buffer.append("&update=true");    }    return invoke(buffer.toString());  }  /** 獲取所有已部署的web應用程序的上下文路徑。格式為path:status:sessions(活動會話數) */  public TomcatManagerResponse list() throws Exception {    StringBuilder buffer = new StringBuilder("/list");    return invoke(buffer.toString());  }  /** 獲取系統信息和JVM信息 */  public TomcatManagerResponse serverinfo() throws Exception {    StringBuilder buffer = new StringBuilder("/serverinfo");    return invoke(buffer.toString());  }  /** 真正發送請求的方法 */  private TomcatManagerResponse invoke(String path) throws Exception {    HttpRequestBase httpRequestBase = new HttpGet(url + path);    HttpResponse response = httpClient.execute(httpRequestBase, localContext);    int statusCode = response.getStatusLine().getStatusCode();    switch (statusCode) {      case HttpStatus.SC_OK: // 200      case HttpStatus.SC_CREATED: // 201      case HttpStatus.SC_ACCEPTED: // 202        break;      case HttpStatus.SC_MOVED_PERMANENTLY: // 301      case HttpStatus.SC_MOVED_TEMPORARILY: // 302      case HttpStatus.SC_SEE_OTHER: // 303      String redirectUrl = getRedirectUrl(response);      this.url = new URL(redirectUrl);      return invoke(path);    }    return new TomcatManagerResponse().setStatusCode(response.getStatusLine().getStatusCode())        .setReasonPhrase(response.getStatusLine().getReasonPhrase())        .setHttpResponseBody(IOUtils.toString(response.getEntity().getContent()));  }    /** 提取重定向URL */  protected String getRedirectUrl(HttpResponse response) {    Header locationHeader = response.getFirstHeader("Location");    String locationField = locationHeader.getValue();    // is it a relative Location or a full ?    return locationField.startsWith("http") ? locationField : url.toString() + '/' + locationField;  }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 色七七久久影院 | 成人免费av在线播放 | 精品久久www | 精品一区二区免费视频视频 | 日本在线不卡一区二区 | 免费一级毛片观看 | 粉色视频污 | 欧美不卡 | 久久免费视频在线 | 欧美精品久久久久久久久久 | www.91视频com | 草莓视频在线导航 | 国产寡妇xxxxxxxx性开放 | 羞羞网站 | 91精品久久久久久久久久久 | 国产精品资源手机在线播放 | 一区二区三区欧洲 | 国产电影精品久久 | 国产精品999在线观看 | 性少妇videosexfreexx入片 | 午夜精品久久久久久久96蜜桃 | 欧美成人二区 | 欧美一级毛片美99毛片 | 久久久久一区二区三区 | 国产成年人网站 | 日本在线视频一区二区三区 | 欧美成人国产va精品日本一级 | 国产一级毛片在线看 | 国产一区二区三区网站 | 国产精品久久久久久久久久10秀 | 亚洲成a人在线 | 一级毛片在线免费观看 | 日韩精品a在线观看 | 99精品无人区乱码在线观看 | 午夜国内精品a一区二区桃色 | 色999国产 | 成人在线视频在线观看 | 在线观看中文字幕av | 在线免费91 | 黄色av网站在线观看 | 鲁丝一区二区三区不属 |