Archive for Java


Javaでproxy.pacを処理させる簡単な方法 その2

add to hatena hatena.comment (0) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 0

 その1では、ブラウザからプロキシ設定を取得するコードを掲載しましたが、今回はJavaのコントロールパネルの設定を完全に読み取るコードです。

 これで、プロキシの対応もバッチリ!(実は、認証付きのプロキシという、高いハードルがあるのですが、そちらはそのうち記事にしたいと思います。。。)

ソースコードはこちらから 続きを読む »


Javaでproxy.pacを処理させる簡単な方法 その1

add to hatena hatena.comment (0) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 0

 ネットワークプログラミングをする場合、ローカルアプリケーションでは考えられないような問題が発生します。

 企業での利用を想定したビジネスアプリで最初に問題になるのが、プロキシやファイアーウォールだと思います。特に大企業になると、拠点毎にプロキシが分れており、proxy.pacと呼ばれるJavaScriptで記述されたファイルをブラウザに設定し、動的にプロキシを切り替える運用が行われております。

 JavaにもWindowsのコントロールパネルに設定パネルがあり、プロキシの設定ができるのですが、普通の手順ではJavaプログラムからこの設定を呼び出す事ができません。また、Sunの公式サイトも情報がありませんでした。

 Java Appletでは、この情報が使われているのは明らかなので、JDKのソースコードを読めば分かると思いがんばって読んでみる事に。。。

 その結果、どうやらJRE_HOME/libにあるdeploy.jarを利用すると良いという事が分りました。以下のコードでブラウザからプロキシの設定を取得する事ができます。当然、proxy.pacもパースすることができ、「ローカル(file:///)」や「ネットワーク(http://)」にファイルが設置されていても読み込めます。

ソースコードはこちらから 続きを読む »


EJB(CMP)でBlobデータを扱う方法

add to hatena hatena.comment (0) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 0

 久しぶりにハマりました。

 今まで、SOBA CITYやSOBA mierukaで利用するバイナリデータはディスクスペース(Apacheアクセス領域)で管理していたのですが、データ自体をデータベースで取り扱うようにした方が、管理が楽になるのと、あまり難しい事を考えずにクラスタリングできるようになるとの理由から、バイナリデータをデータベースに押し込む事にしました。

 まず、データをDBに押し込む事は難なくテーブルにBLOB型のカラムを用意してやり、JDBC経由でDBに押し込む。サンプルは、SOBAフレームワークで利用するキーストアをDBに押し込むコード片です。

String sql = “INSERT INTO keystore2s (id, sessionKsr, sessionTks, userKsr, userTks) “
+ “VALUES (?, ?, ?, ?, ?)”;

PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, strId);
ps.setBinaryStream(2, sessionKsr, sessionKsr.available());
ps.setBinaryStream(3, sessionTks, sessionTks.available());
ps.setBinaryStream(4, userKsr, userKsr.available());
ps.setBinaryStream(5, userTks, userTks.available());

ps.executeUpdate();

 昔、hibernateが出たての頃にプリミティブ型で表現できないような型はすべてObjectにしかマッピングできなかったという嫌な記憶があり、EJBでもBlob型はObject型にマッピングするのだと勝手に思い込み、実行時に以下のようなマッピングエラーに遭遇し調査に時間がかかりました。

java.sql.SQLException: Unable to load to deserialize result: java.io.StreamCorruptedException: invalid stream header

 EJBでは難しいこと考えずに、単にbyte[]型に直接マッピングできました。

 サーブレットでデータを出力するには、HttpServletResponse#getOutputStream()で、ServletOutputStream を取り出し、ServletOutputStream#write(byte[] data)で出力すればok

 Content-Typeは特に必要ありませんが、気になる方は「text/plain」を指定したら良いですよ。