2008年12月9日火曜日

JSP のページ転送で苦しむ

JSPでログイン処理を行い、認証されればログイン後のページに移動させる処理をしています。そこで苦しんだので、メモとして残します。

ログイン後のページをお気に入りにいれる等して直接表示しようとする場合、そのページ内で認証処理が済んでいるか判定し、認証されていないときはログイン処理のページに転送します。

よくあるログインの処理です。
今までも、PHP や ASP などで作ってきました。ところが JSP (JAVA) で作ると問題が発生。

JSP でページを転送する際によくつかわれるのは、forward 文。下記のように使います。

<jsp:forward page="転送先のローカルURL">

この forward はパラメータを引き継ぐことができたりと良い面もあるのですが、他言語と違うのがブラウザのアドレス欄が転送元のアドレスのままなのです。 http://www.a.com/a.jsp で <jsp:forward page="./abc/d.jsp" /> として b.jsp がブラウザに表示されてもアドレス欄は、 http://www.a.com/a.jsp のままです。通常は問題ないんですが、デイレクトリの階層が変わっているので、スタイルシートを相対パスで指定していると、適応できずに素のhtmlが表示されてしまいます。

転送後のアドレスをでスタイルシートを参照してくれればいいのに、なぜか転送前のアドレスで相対パスを見にいきます。ネットで検索しても JAVA 使いには当たり前のことのようで、私と同じように困っている人の質問に対する回答も「それが正常な処理です」といった感じです。
解決策はスタイルシートのパスを絶対パスで書くことぐらいのようです。絶対パスで書いていて、途中でスタイルシートの置き場を変更したら修正作業が大変そうです。将来の変更に柔軟に対応したい。そう思った私は、さらに調べました。

response.sendRedirect("転送先URL");

上記のコードでも転送できることを確認。こちらはブラウザの URL も変わります。
そういうわけで、私の JSP は下記のようなコードになりました。

if (ログイン済み) {
 ログイン済みの処理
} else {
 response.sendRedirect("転送先URL");
}

この response.sendRedirect ではパラメータを引き継ぐ機能がないので、必要があれば転送先URLにパラメータをくっつけてやらないといけません。
あと勘違いかもしれませんが、forwrad はその命令文がでたら即座に転送されるようですが、response.sendRedirect は処理を全て終わらせてから(ソースを下まで処理してから)、転送するようです。

転送先URL も static なクラスにして、いつでも変更できるようにしました。

package parameter;
/**
* デフォルトURLの設定クラス
*/
public class DefaultUrl implements Serializable {
 public static final String url = "http://localhost:8080/"; // 転送URL
 public DefaultUrl() {
 }
}

sample.jsp
if (ログイン済み) {
 ログイン済みの処理
} else {
 response.sendRedirect(DefaultUrl.url);
}

JAVA を使い始めて間がないのですが、こういうコーディングは good なんでしょうか bad でしょうか?詳しい方のコメントお待ちしています。

参考URL : @IT 基礎から学ぶサーブレット/JSP(13) JavaBeansをサーブレット/JSPから利用する

0 件のコメント :

コメントを投稿