Ajax通信。でもProxy認証が・・・

XMLHttpRequestを利用したAjax通信では、同一ドメイン以外へのHTTPリクエストの発行が許可されていない。例えば自ドメインがlocalhostなのに、http://www.google.co.jpにアクセスするなんてことは一足飛びにはできないわけです。
というわけで通常はクライアント(javascript)からはサーバーにリクエストを投げてそこからGoogleに行く、というようなことをしないといけません(JSONPという方法はここではおいておいて・・)。
やってみましょう。画面に表示される「Googleロード」というボタンを押すとAjaxによってページの再描画なしにGoogleのトップページが表示されるというものです。実装はJSP&Servletでいきます。

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="Windows-31J" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
	"http://www.w3.org/TR/html4/loose.dtd">

<HTML>
<HEAD>
  <TITLE>Ajaxサンプル</TITLE>

  <META http-equiv="Expires" content="0">
  <META http-equiv="Pragma" content="no-cache">
  <META http-equiv="Cache-Control" content="no-cache">

  <script type="text/javascript" src="jquery-1.2.6.min.js"></script>
  <script type="text/javascript">
    $(function(){
      $('button').click(function(){
        $('#result').load("http://localhost:5555/SampleAjax/getgoogle");
      });
    });
  </script>
</HEAD>
<BODY>
  <BUTTON>Googleロード</BUTTON>
  <P id="result"></P>
</BODY>
</HTML>

次にサーバーサイドのプログラムです。commonsのHTTP Clientを利用しています。

public class GetGoogleServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {

		HttpClient client = new HttpClient();
		HttpMethod method = new GetMethod("http://www.google.co.jp");

		String responseMessage = null;
		try {
			client.executeMethod(method);
			responseMessage = method.getResponseBodyAsString();
		} finally {
			method.releaseConnection();
		}

		res.setContentType("text/html; charset=UTF-8");
		PrintWriter writer = res.getWriter();
		writer.println(responseMessage);
		writer.close();
	}
}

実行してみるとサーバーサイドで接続エラーが出ており、Googleへアクセスできていないようです。
理由は、うちの会社ではProxy認証が必要なのですがそれをしていないことです。しくしく。
というわけでサーバーサイドのプログラムを少し修正し、プロキシ認証を行います。

・・・略・・・
		HttpClient client = new HttpClient();
		client.getHostConfiguration().setProxy("proxy.some.company", 8080);  // 追加!
		client.getState().setProxyCredentials(AuthScope.ANY, new UsernamePasswordCredentials("username", "password"));  // 追加!

		HttpMethod method = new GetMethod("http://www.google.co.jp");
・・・略・・・

これで、うまくいきました!ヤッホゥー!!