- PR -

Servlet JSPの直接起動抑止について

投稿者投稿内容
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2002-09-10 17:47
Sessionにページにアクセスするたびに現在のページをStackなどを利用して格納しておき、内容をチェックすることで遷移を正常に保つことができるます。
ひろ
常連さん
会議室デビュー日: 2001/12/13
投稿数: 36
投稿日時: 2002-09-10 18:13
>よって現在は各検索機能の「検索ボタン押下」によって各々Sessionを生成
>しています。

ログインでセッションが生成されるのではなくて、ログイン後のサブシステムでセッションの生成を行っているのですか?
検索機能毎に各々Sessionを生成しているっていうのは、各機能毎にSessionの生成、破棄を行っているということでしょうか。

>要は、初回起動(正常)によるSessionがない、および直接起動(異常)による
>Sessionがないのをどう判別したらいいのか。

一般的にはログイン認証に成功したらセッションを生成して、セッションがなければログインページに飛ばすことが多いと思います。実はログイン時にセッション作られてたりしませんか。
直接起動っていってももちろん認証済みの場合ですよね?

大きなシステムのサブシステムってことはすでにそういった処理はシステムの他の部分で行われていて、処理方法なんかは共通のやり方が決められているのではないでしょうか。
ある人は直接アクセスされた際にエラーページを表示し、別の人は特定の画面に飛ばすみたいなことをしてるとシステム全体で一貫性がなくなるので、周りの人に相談してみてはいかがですか。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2002-09-10 18:18
皆様ありがとうございます。

最初はコード数行でできるものなのではないかと
考えていましたが、なかなか難しいようですね。

直接起動チェックでたいそうな機能をつけるのも
いやなのでもう少し考えてみます。

御爺庵様が書かれているようにGETをすべて直接起動と
みなしても良いのですが、JavaScriptのwindow.openで
ServletのURL指定をすると必ずGETになってしまいますね。
formをsubmitさせ、なおかつactionに指定してある
Servletの処理結果をJavaScript:window.open()で別ウィンドウ
に表示さっせることはできないかな・・。

ちょっと辛いところです。

そもそも、なぜ直接起動をチェックしたいかと言うと
たいそうな理由はなく、直接起動した際のServletエラー画面
(ExceptionのStackTrace画面が出てるあれです)をユーザに
見せるのはイヤだなと思ったからです。

webアプリを作成する際、Servletへの直接起動は皆様
どのようにされていますか?
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2002-09-10 18:34
>ひろ様
<!--
ログインでセッションが生成されるのではなくて、ログイン後のサブシステムでセッションの生成を行っているのですか?
検索機能毎に各々Sessionを生成しているっていうのは、各機能毎にSessionの生成、破棄を行っているということでしょうか。
-->

そもそもなぜサブシステム(私が担当)でSessionを扱っているかというと

[HTML]
検索画面で条件を投入後submit

[Servlet]
DBから検索結果を取得し、Beanにセット

[JSP]
Beanから値を取出し、表示

ここでJSP画面での機能として以下があります。
・次ページ表示処理
・前ページ表示処理
・削除処理

上記3機能がなければ、そもそもSessionを使う必要はありません。
上記3機能が呼ばれると、再度Servletが呼ばれ処理します。
その際Servlet側で前回Beanにセットした値を取出す必要があります。

よってSessionの生成は各「検索ボタン押下」の際に生成します。
Sessionの破棄については明示的にはやらず、Timeout値を設定しています。

<!--
一般的にはログイン認証に成功したらセッションを生成して、セッションがなければログインページに飛ばすことが多いと思います。実はログイン時にセッション作られてたりしませんか。
直接起動っていってももちろん認証済みの場合ですよね?

大きなシステムのサブシステムってことはすでにそういった処理はシステムの他の部分で行われていて、処理方法なんかは共通のやり方が決められているのではないでしょうか。
ある人は直接アクセスされた際にエラーページを表示し、別の人は特定の画面に飛ばすみたいなことをしてるとシステム全体で一貫性がなくなるので、周りの人に相談してみてはいかがですか。
-->

確かにその可能性はありますね。ただその場合、ログイン側もjavaでSessionを管理している
ことが前提なのではないでしょうか?(Sessionニ対する知識が疎いのでよくわかりませんが)

ログイン側は外部の事業者であるため、よくわかりません。
そのあたり少し聞いてみたいと思います。

ありがとうございます。



ひろ
常連さん
会議室デビュー日: 2001/12/13
投稿数: 36
投稿日時: 2002-09-10 19:55
なるほど、ログインからずっとJavaというわけではないのですね。

直接アクセスされるとエラーが出るというのは、RequestやSession内に必要な値が無いからですか?だとすれば、それをチェックしてやって、適切なページに送ってやればいいと思います。

あとはAnthyhimeさんの投稿のようにセッションで遷移情報を管理してやれば大丈夫ではないでしょうか。

(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2002-09-11 11:57
直接起動チェックの問題からセッション管理につながり
もっと大きい視野でシステムとしてのセッション管理
を考えねばならないことに気づき大変ありがたいです。

こちらでも今度はセッションについて色々試してみました。
前提としては以下のようなものがあります。
・大きいシステムとしてのログイン機能はjavaで実装されているとする
・セッションはログイン時に生成され、以後サブシステムではそのセッション
 を使用する。
・本体システム(上記の大きいシステム)はサーバAに、私が担当するサブシステム
 はサーバBに置かれている。

つまり本体システムとサブシステムが別サーバ上で実装されている場合、
(実際このようになると思います)セッションを引継がせることは可能なのか。
という別問題に当たりました。

試したものは以下のようなことです。
[サーバA:ServletA]
1.Sessionの新規生成(req.getSession(true))
2.java.net.HttpURLConnectionにより、サーバB:ServletBにrequestを転送

[サーバB:ServletB]
1.Sessionの取得(req.getSession(false))

上記のようにするとServletBでのSessionがnullになってしまいます。
request自体は正常に送れていると思います。試しにtextデータを
送ってサーバBで取ってみましたがきちんと取れました。


そもそもsession情報を別サーバに転送することはできないのでしょうか?


長くなるのでコードは省きますが、必要であれば書きます。
環境は以下の通りです
[サーバA]
windows2000pro+apache1.3.26+omcat3.3.1+JDK1.3.01

[サーバB]
windows2000server+apache1.3.26+omcat3.3.1+JDK1.3.01



ひろ
常連さん
会議室デビュー日: 2001/12/13
投稿数: 36
投稿日時: 2002-09-11 14:01
別マシンで稼動しているのなら、当然別々のJVM上で動いているので単純に他のマシンで生成したセッションオブジェクトを取得はできませんね。
Request転送でセッションIDは渡せてもオブジェクトを渡すことはできないですから、なんらかの形で永続化して共有するしくみが必要です。商用のAPサーバならその辺の機能が充実してると思いますが、Tomcatではどうなのでしょう。ちょっとわからないです。

WebSphereに関してなんですが、セッションについてもわかりやすく解説してます。参考になるかもしれません。
http://www-6.ibm.com/jp/software/websphere/developer/performance/vol5.html

@ITの記事です。WebLogic用いてます
http://www.atmarkit.co.jp/fjava/onepoint/weblogic/weblogic01.html

Tomcatに関しては別にスレッドがあったと思います。そちらで質問してみてはいかがでしょう。

スキルアップ/キャリアアップ(JOB@IT)