민서네집

HttpClient 를 이용하여 프록시 프로그램 작성 본문

Java

HttpClient 를 이용하여 프록시 프로그램 작성

브라이언7 2012. 8. 29. 17:38

Ajax 를 이용하여 다른 도메인에 접근하려 할때 HTTP 헤더에 특별한 값을 추가하지 않으면 통신이 안된다는 제약사항이 있다.

IE 에서는 2차 도메인이 다르더라도 1차 도메인이 같으면 통신이 된다. (HTTP 통신 포트가 달라도 됨)

IE 가 가장 보안이 허술하다고 할 수 있다.

그래서 다른 웹브라우저에서는 Ajax 가 작동 안하는데, IE 에서만 작동하는 경우가 있다.

 

그런데 자기 서버에 Proxy 프로그램(jsp)을 만들어서 자기 서버에서 다른 서버로 통신한 후에 그 결과값을 반환해서 우회하는 방법이 있다.

 

< HttpClient 홈페이지 >

 

http://hc.apache.org/

 

< 참조 소스 >

 

http://blog.naver.com/gozjkim/140053333098

 

http://danhobak-textcube.blogspot.kr/2010/03/http-post-%EB%B0%A9%EC%8B%9D%EC%9C%BC%EB%A1%9C-header-%EC%84%A4%EC%A0%95-%EB%B0%8F-xml-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%86%A1.html

 

* 다음 예제처럼 HttpURLConnection 을 사용하는 방법도 있었다.

http://stackoverflow.com/questions/2735839/posting-xml-request-in-java

 

http://devday.tistory.com/entry/HttpClient%EC%9D%98-POST-%EC%98%88%EC%A0%9C


다음 예제는 request 로 xml 데이터를 주고, response 로 xml 을 받을때 HttpClient 3.1 버전을 이용해서 Proxy 프로그램을 작성한 예이다.

 

<%@ page language="java" contentType="text/xml; charset=utf-8" pageEncoding="utf-8" %>
<%@ page import = "org.apache.commons.httpclient.methods.PostMethod" %>
<%@ page import = "org.apache.commons.httpclient.HttpClient" %>
<%@ page import = "org.apache.commons.httpclient.HttpStatus" %>
<%@ page import = "java.io.*" %>
<%
 /*
  * PROGRAM ID : proxy.jsp
  * PROGRAM NAME : proxy.jsp
  * DESCRIPTION : 다른 도메인에 접근할 수 없는 Ajax 보안 제약사항을 우회하기 위한 Proxy 프로그램.
  * AUTHOR  : heeseok.kang
  * CREATE DATE : 2012.08.29
  * 참고 소스(1) : http://blog.naver.com/gozjkim/140053333098
  * 참고 소스(2) : http://danhobak-textcube.blogspot.kr/2010/03/http-post-%EB%B0%A9%EC%8B%9D%EC%9C%BC%EB%A1%9C-header-%EC%84%A4%EC%A0%95-%EB%B0%8F-xml-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%86%A1.html
  */
 response.setHeader("Pragma", "no-cache");
 response.setDateHeader("Expires", 0);
 response.setHeader("Cache-Control", "no-store");
 request.setCharacterEncoding("utf-8");
 /*
 // 아래와 같이 getReader()를 사용하면 한글이 깨져서 전달된다. 
 // 따라서 String 으로 변환하지 않고 input stream을 request body에 바로 setting 해 주었음. 
 String thisLine;
 String xml = "";
 
 try {
   BufferedReader br = request.getReader();
   while ((thisLine = br.readLine()) != null) 
   {
     System.out.println(thisLine);
    xml += thisLine + "\n";
   } 
 }
 catch (IOException e) {
   System.err.println("Error: " + e);
 } */
 String url = "http://aaa.com/likage.jsp"; // 연동할 페이지
 HttpClient client = new HttpClient();
 PostMethod method = new PostMethod(url);
 String contentType = request.getContentType();
 //method.setRequestBody(xml);
 method.setRequestHeader("Content-type", contentType);
 method.setRequestBody(request.getInputStream());
 try {
  int statusCode = client.executeMethod(method); // url에 지정한 사이트에 접속함.
  out.clearBuffer();
  response.reset();
  response.setStatus(statusCode); // 외부사이트의 결과 상태 코드를 프록시의 응답 상태 코드로 지정
  //if( statusCode == HttpStatus.SC_OK ) 
  { // 외부사이트 접속이 성공일 경우
   String result = method.getResponseBodyAsString();
   response.setContentType("text/xml; charset=utf-8"); //외부 사이트의 결과를 프록시의 응답결과로 전송
   out.println(result);
  }
 } finally {
  if (method != null)
   method.releaseConnection();
 }
%>



[2013-04-02] 다음 코드 추가. 

String contentType = request. getContentType ();

 method.setRequestHeader("Content-type", contentType); 


[참조] http://stackoverflow.com/questions/5799847/httpclient-postmethod-for-byte


위 jsp를 실행하는데 필요한 라이브러리(jar) 파일


commons-codec-1.7.jar


commons-httpclient-3.1.jar


commons-logging-1.1.2.jar


Comments