Last active
July 6, 2021 22:18
-
-
Save lidaling/e76cf074cca7c03f53f86ca22fadaa86 to your computer and use it in GitHub Desktop.
httpclient 转发
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public boolean forward(HttpServletRequest request, HttpServletResponse response , String serviceName) throws IOException { | |
String[] serviceNames = forwardname.split(";"); | |
String requestURI = request.getRequestURI();//获取请求URI | |
String queryParam=request.getQueryString();//获取请求url中的参数 | |
String url= targetUrl + requestURI; | |
if(StringUtils.isNoneBlank(queryParam)) { | |
url = url + "?" + queryParam; | |
} | |
logger.info(serviceName + "=================== forward to " + url ); | |
CloseableHttpClient httpclient = HttpClientBuilder.create().build(); | |
HttpPost httpPost = new HttpPost(url); | |
Map<String ,String> headerMap = getHeadersInfo(request, null); | |
for(Map.Entry<String, String> entry : headerMap.entrySet()) { | |
httpPost.setHeader(entry.getKey(), entry.getValue()); | |
} | |
InputStream inputstream = request.getInputStream(); //获取post请求中的流,并直接以流的形式转发到新网关 | |
InputStreamEntity inputEntity = new InputStreamEntity(inputstream); //直接、 | |
httpPost.setEntity(inputEntity); | |
httpPost.removeHeaders("Content-Length"); | |
CloseableHttpResponse threadResponse = httpclient.execute(httpPost); | |
Header[] headers = threadResponse.getAllHeaders(); | |
String result = null; | |
StatusLine statusLine = threadResponse.getStatusLine(); | |
if (statusLine.getStatusCode() == HttpStatus.SC_OK) { | |
HttpEntity entity = threadResponse.getEntity(); | |
threadResponse.getAllHeaders(); | |
if (entity != null) { | |
result = EntityUtils.toString(entity, "UTF-8"); | |
} | |
} else { | |
result = JSON.toJSONString(statusLine); | |
} | |
if(headers != null ) { | |
//response的设置响应头 | |
for(Header header : headers) { | |
response.setHeader(header.getName(), header.getValue()); | |
} | |
} | |
try { | |
logger.info("forward response headers ==============" + JSON.toJSONString(headers)); | |
logger.info("forward response body ==============" + result); | |
//直接返回新网关响应的内容 | |
PrintWriter writer = response.getWriter(); | |
writer.print(result); | |
writer.flush(); | |
writer.close(); | |
} catch (Exception e) { | |
logger.error("Write body to response error, " + e.getMessage()); | |
} | |
return false; | |
} | |
/** | |
* 根据GET方式请求获取请求内容 | |
* @param url | |
* @return | |
*/ | |
private String getContentFromUrlByGet(String url) { | |
String content = ""; | |
try { | |
HttpClient client = new HttpClient(); | |
GetMethod getMethod = new GetMethod(url); | |
client.executeMethod(getMethod); | |
InputStream stream = getMethod.getResponseBodyAsStream(); | |
int length; | |
byte[] buffer = new byte[1024 * 4]; | |
StringBuffer stringBuffer = new StringBuffer(); | |
while ((length = stream.read(buffer)) != -1) { | |
stringBuffer.append(new String(buffer, 0, length, "utf-8")); | |
} | |
content = new String(stringBuffer); | |
getMethod.releaseConnection(); | |
} catch (Exception e) { | |
// TODO Auto-generated catch block | |
e.printStackTrace(); | |
} | |
return content; | |
} | |
/** | |
* 根据POST请求获取请求内容 | |
* @param url | |
* @return | |
*/ | |
private String getContentFromUrlByPost(String url) { | |
String content = ""; | |
try { | |
HttpClient client = new HttpClient(); | |
PostMethod postMethod = new PostMethod(url); | |
// 增加变量 | |
postMethod.addParameter("name", "name"); | |
postMethod.addParameter("pwd", "pwd"); | |
client.executeMethod(postMethod); | |
InputStream stream = postMethod.getResponseBodyAsStream(); | |
int length; | |
byte[] buffer = new byte[1024 * 4]; | |
StringBuffer stringBuffer = new StringBuffer(); | |
while ((length = stream.read(buffer)) != -1) { | |
stringBuffer.append(new String(buffer, 0, length, "utf-8")); | |
} | |
content = new String(stringBuffer); | |
postMethod.releaseConnection(); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
return content; | |
} | |
/** | |
* 文件访问中转 | |
* @param url 地址 | |
* @param resp 响应 | |
*/ | |
public void relay(String url, HttpServletResponse resp){ | |
if(url==null || "".equals(url.trim())){ | |
return; // url为空时不处理 | |
} | |
CloseableHttpClient httpClient = HttpClientBuilder.create().build(); | |
CloseableHttpResponse response = null; | |
System.out.println("要转发的文件地址:"+url); | |
try { | |
response = httpClient.execute(new HttpGet(url)); | |
HttpEntity entity = response.getEntity(); | |
int status = response.getStatusLine().getStatusCode(); | |
resp.setStatus(status); | |
if (status==200 && entity!=null) { | |
//Content-Type根据文件实际类型设置 | |
resp.setHeader("Content-Type", "application/pdf;charset=utf-8"); | |
resp.setHeader("Content-Length", entity.getContentLength()+""); | |
resp.setHeader("Content-Encoding", "UTF-8"); | |
InputStream is = entity.getContent(); | |
OutputStream os = resp.getOutputStream(); | |
byte[] buffer = new byte[1024]; | |
int ch; | |
while ((ch = is.read(buffer)) != -1) { | |
os.write(buffer, 0, ch); | |
} | |
is.close(); | |
os.flush(); | |
os.close(); | |
} | |
} catch (IOException e) { | |
e.printStackTrace(); | |
}finally { | |
try { | |
if (httpClient != null) { | |
httpClient.close(); | |
} | |
if (response != null) { | |
response.close(); | |
} | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment