- PR -

フィルターにおけるセッションについて

1
投稿者投稿内容
lafi
会議室デビュー日: 2002/12/27
投稿数: 10
投稿日時: 2003-09-04 03:17
Strutsを使用したWEBアプリを作成しているのですが、
そのなかの、ログイン部分について分からないことがあり、
(Filterを使用した際の、セッションで問題が発生しております。)
ご教授願いたく投稿しました。


ログイン部分の構成としては、
1.ログインに必要なIDとPASSを入力するlogin.jsp
2.ログイン処理をするアクションビーン(ログイン情報はセッションに入れる)
3.ログインを必要とするディレクトリ(/admin/****)に対応している認証チェック用フィルター
4.ログイン成功後の遷移先/admin/index.html

があり、ログインがうまくいけば、1−>2−>3−>4と遷移していくはずなのですが、
1度目のログインを行うとなぜかフィルターの認証チェック部分でコケます。
ログを見る限りの具体的な症状としては、
1.でID、PASSを入力、送信。
2でログイン成功(セッションにログイン情報を格納)ログイン成功後のアクションビーンの遷移先/admin/index.htmlへ遷移。
3.遷移先の/admin/index.htmlは表示されるものの、その中で使用している画像がFilterの機能によって表示できない(原因はセッション内にログイン情報がないため)

となっています。色々調べて見たのですが、
1度目のログインでは、上のような現象が起きますが、もう1度ログインを行うと問題なく
/admin/index.htmlへ遷移、画像も表示されます。(ブラウザの再読み込みでもOK)

また、1度目のログインで、/admin/index.htmlへ遷移、htmlは表示されるものの、画像が表示されないときの
状況を見てみると、フィルター内ロジックでは、ログインに成功した際に格納したセッションと
異なるセッション見ているようです。(セッションIDが異っていることで確認)

(補足ですが、/admin/index.html内には画像が10個ほどあるのですが、
1度目のログイン成功時には、10回とも異なるセッションが
生成され参照されていることが確認できました。
(Filter内でセッションIDを出力することにより確認しました。))

なので、原因としては、
1度目のログイン成功時に、なぜかFilter内で、ログインしたさいに生成されたセッションをみず
新たに生成した異なったものを見ていることだとおもわれます。
しかし、どうしてこうなるのか。
また、2度目のログイン作業時にはなぜそれがなくなり、
正常に両者で同じセッションを見るようになるのかがまったく分かりません。
解決の検討もつかず、かなり悩んでおります。
なにかヒントだけでも教えていただけないでしょうか。
よろしくお願いします。



環境
j2sdk 1.4.0.03
tomcat 4.0.3
struts 1.1 RC3
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2003-09-04 23:53
lafiさんこんにちは。

検討はずれなこと言うかもしれませんが、
今回の用途では画像を1個1個セッションをチェックする必要が
あるのですね?
この場合、/admin/index.html に記述された、画像に
セッション情報をつけているでしょうか?
つまり、<img src="xxxx.jpg"> のようになってたり
してないでしょうか? (encodeURL()忘れてるとか?)
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-09-05 13:38
引用:

Kissingerさんの書き込み (2003-09-04 23:53) より:
lafiさんこんにちは。

検討はずれなこと言うかもしれませんが、
今回の用途では画像を1個1個セッションをチェックする必要が
あるのですね?
この場合、/admin/index.html に記述された、画像に
セッション情報をつけているでしょうか?
つまり、<img src="xxxx.jpg"> のようになってたり
してないでしょうか? (encodeURL()忘れてるとか?)



 これだと常に取れなくないですか?
URLリライティングの場合は、
URLに常にセッションIDをくっつけているので。

 lafiさんは、
引用:

1度目のログインでは、上のような現象が起きますが、もう1度ログインを行うと問題なく
/admin/index.htmlへ遷移、画像も表示されます。(ブラウザの再読み込みでもOK)


とおっしゃっています。

 私はフィルターは未経験なので、自分自身の勉強ついでに、
セッションを使うフィルターを作成してテストしてみました。
SampleFilter→SampleFilter2→JSPの順に遷移するように、
web.xmlに登録しテストしてみましたが、
問題なくセッションが渡っていく様子が確認できました。
該当部分の前後のソースを提示した方が良いかもしれませんね

//SampleFilter.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SampleFilter implements Filter{

public void init(FilterConfig filterConfig){
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException{
System.out.println("SampleFilter 処理開始");
HttpSession session = ((HttpServletRequest)request).getSession();
session.setAttribute("param","フィルターのテスト");
chain.doFilter(request,response);
}

public void destroy(){
}

}

//SampleFilter2.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SampleFilter2 implements Filter{

public void init(FilterConfig filterConfig){
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException{
System.out.println("SampleFilter2 処理開始");
HttpSession session = ((HttpServletRequest)request).getSession();
System.out.println((String)session.getAttribute("param"));
chain.doFilter(request,response);
}

public void destroy(){
}

}

//JSP
<%@ page contentType="text/html; charset=MS932"%>
<jsp:useBean id="param" scope="session" class="java.lang.String"/>
<html>
<head>
<title><%=param%></title>
</head>
<body>
<h1><%=param%></h1>
</body>
</html>
lafi
会議室デビュー日: 2002/12/27
投稿数: 10
投稿日時: 2003-09-05 14:08
Kissingerさん、takuさん、
お返事ありがとうございました。


返事が遅くなってしまいましたが、
セッションがとれない件、解決しました。
原因は、ログイン前と、ログイン後でドメインが違っていたのが原因のようです、、、
初歩的なミスで、ご迷惑おかけして申し訳ありません。


せめて、詳細だけでも残しておきたいと思います。

今まで、ログインするときはhttp://192.168.0.1/login.jsp
からアクセスしていたのですが、遷移先ページでは、http://test.co.jp/admin/index.html
とドメイン部分が変化していたことが原因でした。(ドメインが変化するのはログインページのJSPに
ベースタグ指定をしてをしていたためだと思われます。)

つまり、
1.http://192.168.0.1/login.jsp からログイン
2.ログイン処理(アクションビーン内)=>セッションにログイン情報を保存
3.ログイン成功=>Strutsの機能によりhttp://test.co.jp/admin/index.htmlを読み込む。
4.さらにhttp://test.co.jp/admin/index.html内で画像を読み込むため、
  http://test.co.jp/admin/img/****.jpg等にアクセスしようとするが、
  フィルター機能により認証済みかチェックされる。ここで、
  セッションにログイン情報を記録したのは「192.168.0.1」であるが、
  現在はドメインが「test.co.jp」となってしまっているので、以前のセッションを読み取れない。
  =>ログインしていないとみなされ、「http://test.co.jp/admin/img/****.jpg」へのアクセスが拒否される。
  また、拒否する場合、((HttpServletResponse)response).sendRedirect("/error.jsp");
  として、エラーページへ飛ばしているが、画像読み取りのアクセスのため、意味がない。

といったことで、htmlファイルのみ読み込まれているにもかかわらず、そのた
画像リソース等が表示されない。かつこの現象が現れるのが1度目のアクセス時のみ
という現象が起きていたと思われます。


ログイン後、セッションIDをURLにつければいいのかも知れませんが、
戻り先へのURLは、struts-config内で指定してしまっているのでそれは出来ず。。。
また、1度「192.168.0.1」ドメイン内のファイルにアクセス、リダイレクトするときに
IDをつける等方法はいくつかありそうですが、実際にはIPでアクセスせず、
ドメインでアクセスするので特に対処しないことにしました。

これからもよろしくお願い致します。
1

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