プロが教える店舗&オフィスのセキュリティ対策術

現在、Java初心者ながら、JSP+サーブレットでプログラムを開発中です。
以下のようなHTMLから、それぞれのリンクをクリックすると、サーブレット側では、常に最初にクリックした方のセッション情報を取得してしまいます。
「TANAKA」をクリックしてある値をセッションに保存しますが、そのブラウザを開いた状態(セッションを破棄しないで)次に「SUZUKI」を
クリックすると、やはりセッションにはその値がセットされています。
それぞれのリンク("TANAKA"と"SUZUKI")をクリックした場合に、別のセッションとすることは可能なのでしょうか?

2つのブラウザを同時に表示し、URLのパラメータをに従って別の処理(検索)をしたい思っています。
(リクエストのパラメータは"tanaka"と"suzuki"が正しく取得できます。)

アドバイスを宜しくお願い致します。

▼HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE></TITLE>
</HEAD>
<FORM>
<BODY>
<TABLE>
<TR>
<a href="http://localhost:8080/abc?name=tanaka" target="_blank">TANAKA</a>
</TR>
<TR>
<a href="http://localhost:8080/abc?name=suzuki" target="_blank">SUZUKI</a>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>

▼セッション情報を取得しているサーブレット
HttpServletRequest httpReq = (HttpServletRequest) req;
HttpSession session = httpReq.getSession(true);

A 回答 (2件)

>セッションに設定したパラメータの値が共有されてしまうことに悩んでおります。



なるほど、そういう意味でしたか…

そうなるとサーブレット側で新規にセッションを発行するのは無理だと思います。
御存知かもしれませんが、セッションは以下からセッションIDを取得し、サーバでそのセッションIDを判断し取得します。
・Cookie
・URL
・hidden

通常セッションはCookieからセッションIDを取得しますが、恐らくこれでは複数のセッションIDを設定できません。
そこで、URLにセッションIDを付与してやるとできるかもしれません。(試していないのでわかりませんが・・・)
方法としては
<a href="http://localhost8080/abc?name=tanaka;jsessionid=適当な16進数" target="_blank">TANAKA</a>

ただし、これで成功した場合注意が必要です。
セッションIDが固定されているため、複数のブラウザから同時にTANAKAをクリックし、そのうち1つのブラウザがセッション情報を変更した場合、他のブラウザでもセッション情報が変更されてしまいます。
それが駄目な場合は、あとはAppletなどでブラウザを新規に開かせるぐらいしか思いつきません。

この回答への補足

アドバイス有難うございます。

>通常セッションはCookieからセッションIDを取得しますが、恐らくこれでは複数のセッションIDを設定できません。
>そこで、URLにセッションIDを付与してやるとできるかもしれません。>(試していないのでわかりませんが・・・)
>方法としては
<a href="​http://localhost8080/abc?name=tanaka;jsessionid=​適当な16進数" target="_blank">TANAKA</a>

調べた限りでは、ブラウザのCookieの設定を無効にしないと、この方法は利用できないとのことでしたが、ユーザ環境ではCookieは無効にすることができません。(他システムで利用が必須のため)

HttpSession session = httpReq.getSession(true);
ここで、強制的に新規sessionオブジェクトを生成できる、もしくは、セッションIDを指定してsessionオブジェクトを生成するなんていう芸当は無理そうですね。

hiddenを使う方法はまだ調べていないので、これから少し調べてみます。

補足日時:2009/05/02 00:18
    • good
    • 0

別のセッションにするのではなく、セッションにパラメータを設定してそのパラメータで判断するのではだめなのでしょうか?



HttpServletRequest httpReq = (HttpServletRequest) req;
HttpSession session = httpReq.getSession(true);
session.setAttribute("NAME", req.getParameter("name"));

リンクを押下する度に以上の処理をすれば、セッションにパラメータが設定されます。

取得するときは
String name = (String)session.getAttribute("NAME");
で、設定したパラメータを取得できます。

この回答への補足

返信が遅くなり申し訳ございません。

>別のセッションにするのではなく、セッションにパラメータを設定してそのパラメータで判断するのではだめなのでしょうか?
>HttpServletRequest httpReq = (HttpServletRequest) req;
>HttpSession session = httpReq.getSession(true);
>session.setAttribute("NAME", req.getParameter("name"));
>リンクを押下する度に以上の処理をすれば、セッションにパラメータが設定されます。

セッションに設定したパラメータの値が共有されてしまうことに悩んでおります。
HttpSession session = httpReq.getSession(true);
session.setAttribute("NAME", req.getParameter("name"));
の部分において、"TANAKA"のリンクをクリックした後に、"SUZUKI"のリンクをクリックすると、既にsessionが作成済みと判定され(isNewが
false)、"NAME"の値が上書きされてしまいます。
よって、"TANAKA"リンクと"SUZUKI"リンクから起動したブラウザを同時に表示していると、以降の処理でsessionからデータを取得する際、NAMEの値がいずれも"suzuki"となってしまいます。

HttpSession session = httpReq.getSession(true);
ここで、リンクをクリックするたびに、新規セッションとしてsessionオブジェクトを作成してくれれば、問題ないと思いのですが。
それは無理なのでしょうか。。。

補足日時:2009/04/30 18:34
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!