2008-07-02

Jaxer 0.9.7 はレスポンスでリダイレクトできないので代替策をいろいろ試してみた

Aptana Jaxer 0.9.7.2472 は、HTTP レスポンスを使ったリダイレクトの仕組みを提供していません。Jaxer は単なるサーバではなく、Apache2 など WEB サーバのレスポンスフィルタとして機能する仕組みなので、もとのレスポンスを無効化して、リダイレクトするという考え方がフィットしないんだろうと推測します。

といっても、リダイレクトしたいという要望はいくつか上がっているようです。次の Issue は、現在のバージョンだとリダイレクトできないので、ステータスコードと URL を指定してリダイレクトできるようになればよいという趣旨のものです。間違ってたらごめんなさい。

[#JXR-173] add Jaxer.response.redirect(301,url);
Currently there is no support(that i can find or that john knows about) in the framework for redirecting a page using the http header Location: {url} , and setting the resonse code to one of the 3xx values.
次の Issue は、レスポンスに Location ヘッダを入れたらどうだろうという趣旨のものです。間違ってたらごめんなさい。

[#JXR-182] Support jaxer redirect in mod_jaxer
Done. Just need to set Location to the redirect URL in framework when needed.
実際に手元の環境で、次のとおり、サーバサイドで HTTP レスポンスに Location ヘッダを追加してみました。確かに Location ヘッダは追加されるのですが、WEB ブラウザは Location ヘッダを認識せず、リダイレクトしてくれませんでした。

<script type="text/javascript" runat="server">
//<![CDATA[
Jaxer.response.addHeader("Location", "http://www.google.com/", true);
//]]>
</script>

HTTP レスポンスを使ったリダイレクトは実現できないため、クライアントサイドの仕組みを使ってリダイレクトする方法を2通り試してみました。

1つ目は、JavaScript を使ってリダイレクトする方法です。実際はリダイレクトじゃなくページ遷移です。Jaxer.clientData を使って、リダイレクト先の URL をサーバサイドからクライアントサイドに引き渡し ます。クライアントサイドは、Location オブジェクトにリダイレクト先の URL を指定してページ遷移させます。


<script type="text/javascript" runat="server">
//<![CDATA[
Jaxer.clientData.redirectUrl = 'http://www.google.com/';
//]]>
</script>

<script type="text/javascript">
//<![CDATA[
if (Jaxer.clientData.redirectUrl)
window.location = Jaxer.clientData.redirectUrl;
//]]>
</script>

2つ目は、ページをリロードするための meta 要素を追加する方法です。サーバサイドで meta 要素を生成して、head 要素に追加しています。このとき、ページのリロードを0秒後、リロード先の URL を指定し、リダイレクトに相当する振る舞いを促しています。

<script type="text/javascript" src="jquery.js" runat="server"></script>
<script type="text/javascript" runat="server">
//<![CDATA[
jQuery(function($) {
var meta = $('<meta />')
.attr('http-equiv', 'Refresh')
.attr('content', '0; URL=http://www.google.com/');
$('head', document)
.prepend(meta);
});
//]]>
</script>

なお、今後公開される Jaxer 1.0 (RC1) では、Jaxer.Response.redirect(url) メソッドを追加してリダイレクトをサポートするとのことです。なので、次のように、サーバサイドからリダイレクトを指示できるようになるということですね。

<script type="text/javascript" runat="server">
//<![CDATA[
Jaxer.response.redirect("http://www.google.com/");
//]]>
</script>

0 件のコメント: