質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

1374閲覧

Javaサーブレットの機能をブラウザごとに独立させて動かしたい

rigomammo

総合スコア5

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

2クリップ

投稿2020/10/30 04:42

テキストボックスに入力された文字列が入力フォームの下に追記されて表示されるプログラムをサーブレットファイルのみで作成しています。

入力した文字列をブラウザごとに独立させて動かすため、HttpSessionを使って実装をしているのですが、2つのブラウザで連動してしまいます。

getSessionメソッドを使用すれば新しいセッションIDを生成するようですが、文字列入力後のsubmit時に別ブラウザで入力された内容が反映されてしまいます。getIdメソッドを使ってセッションIDを取得すればもしかして、、とも思いましたが改善しませんでした。

標題のように別ブラウザで入力した内容はsubmit時に反映しないようにしたいです。
下記はサーブレットのコードになります。

servlet

1 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 // ヘッダに出力形式をセット 3 response.setContentType("text/html; charset = UTF-8"); 4 5 // 出力ストリームを作成 6 PrintWriter out = response.getWriter(); 7 8 request.setCharacterEncoding("UTF-8"); 9 10 // セッションからすでに表示されたデータを取得 11 HttpSession session = request.getSession(); 12 ArrayList<String> al = (ArrayList<String>)session.getAttribute("Data"); 13 14 if( al == null ) { 15 al = new ArrayList<String>(); 16 session.setAttribute("Data", al); 17 } 18 19 // テキストボックスからデータを受け取る 20 String input = request.getParameter("param"); 21 22 al.add(input); 23 24 // HTML文を出力 25 out.println("<html><head>"); 26 out.println("<meta charset=\"UTF-8\">"); 27 out.println("<title>SrvletTest</title>"); 28 out.println("</head>"); 29 out.println("<body>"); 30 out.println( "<form method=\"POST\" action=\"B26_HelloWeb\">" ); 31 out.println("<input type = \"text\" name = \"param\" maxlength = 20>"); 32 out.println("<input type = \"submit\"><br>"); 33 34 for(int i = 0; i < al.size(); i++) { 35 out.println("<p>"+ al.get(i) + "</p>"); 36 } 37 out.println("</form>"); 38 out.println("</body></html>"); 39 out.close(); 40 41 } 42

以上、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

HttpSessionはブラウザにセッションクッキーを発行して同一のセッションであるかを判定していますので、むしろ共有されます。これは同一のブラウザを複数立ち上げた場合でもクッキーが共有されるため、つまり同一のセッションとみなすのでこの状態になります。

独立していれば共有されることはありません(※)が、デフォルトでは完全に別のブラウザを立ち上げなければセッションクッキーは共有されるため、通常のセッションの仕組みだけでは実現できません。
※Chromeのシークレットモードを起動した場合はセッションが共有されませんので、この限りではありません

もし開いているブラウザのページごとにデータを保持したい場合は、ページごとに一意となるID(UUID.toString()を使うのが簡単です)を常にリクエスト属性へ格納しておき、データを格納、表示するときにはこのUUIDをキーにしてセッションへ格納しておく手段などがあります。

投稿2020/10/30 13:19

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rigomammo

2020/11/02 04:38

ご回答誠にありがとうございます。 HttpSessionを使用している時点で共有はされるものなんですね。 開いているブラウザのページごとにデータを保持したいのですが、UUIDを使用するとして、現在のHttpSessionの使用から変更する必要があるものでしょうか。
A-pZ

2020/11/02 07:52

開いたページごとに重複しないidを発行する方法、ひとつの例として初期ページを開くときのみUUIDを発行し、リクエストパラメータなどで常に画面から渡すようにし、そのパラメータの値でHttpSessionないしは別の物理ストレージからデータを授受する方式に変えなければならないかと。HttpSessionのAPIをそのまま利用する方法では実現できません。
rigomammo

2020/11/02 08:24

ご返信ありがとうございます。 なるほど、現状のHttpSessionの利用方法では実現できないということですね。 恐れ入りますが、現状から具体的にどのように記述の修正をすればいいのかご教授頂けると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問