• ベストアンサー

セッション管理

失礼いたします。 セッション情報の受け渡しを勉強しています。 送り手側で HttpSession ses = request.getSession(); String login = (String)ses.getAttribute("login"); String name = (String)ses.getAttribute("name"); if( !("ttttt".equals( login )) ) {  //(以下処理) 受けて側で String name = request.getParameter("user"); String pass = request.getParameter("pass"); HttpSession ses = request.getSession(); if ( name.equals("admin") && pass.equals("hoge")) { ses.setAttribute("login","ttttt"); ses.setAttribute("name",name); out.println("<h3>ログインしました。</h3>"); } とし、セッション管理を行っています。 しかし、今ひとつこの「セッション情報」と普通のパラメーターの受け渡しの違いが分かりません。どちらも文字として次ページへ送っていますので。セッションがずっと保持されるとはソースのどういう所から分かるのでしょうか?漠然とした質問ですが、よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 getParameterで値を取得する場合はフォームよりサブミットされる必要があります。 (getの場合はURLで) セッションは一度値を登録してしまえばセッションが切れるまでは サブミット等のリクエストが無くても情報を取り出すことができます。 ログイン画面よりユーザIDとパスワードを入力しサブミット パラメータで受け取ったユーザIDとパスワードを使用して認証を行い、OKだった場合はセッションにユーザID等のログイン情報を格納 認証が必要なページにてセッションの有無を確認し、ログインしているかしていないかをチェック セッションを使わないと、ユーザIDやパスワードをフォームのhidden項目に埋め込んだりして、 常にクライアントに次へのボタン等でアクションを起こさせる必要があります。 セッションに登録してあれば、そこから値を取るだけなのでフォームのhidden項目等に埋め込むこと、 またボタンを押してもらう等の操作が不必要になります。 ソースのどの部分からというよりは、作り方の問題だと思います。

javatea_1985
質問者

お礼

>サブミット等のリクエストがなくても 決定的な違いがそこにありました。 ありがとうございます! 最近ちょっと泥沼状態(焦ってます)でして、人に言ってもらわないとそんなことすら気付きませんでした。

その他の回答 (1)

noname#18558
noname#18558
回答No.2

そもそも、セッション情報はページをまたがって送るということはしません。 この辺りのことは、Webアプリケーションのシステムを理解していないとなかなか難しいと思います。 パラメータというのは、リクエストのパラメータのことですね。 これは、HTTPのパラメータのことで、 HTTPのメソッドのGETとPUTで若干仕組みが変わりますが、ほぼ同等の意味になります。 これは、ブラウザから送信される情報で、HTTPに載ってサーバーに送られてきます。 HTTPの仕組みを調べてみて下さい。 一方、セッションというのはセッションコンテナによって管理されている領域のようなものです。 セッション情報は、メモリに保持されどこにも渡ったりしません。 request#getSession()メソッドを呼ぶことによって、自分のセッション領域を取得します。 セッション管理を調べてみて下さい。 この辺りのことは、一朝一夕では理解できないと思いますので、色々自分で試してみたりするといいかも知れません。 という私も、これを完全に理解するのに半年もかかりました。

javatea_1985
質問者

補足

半年かかったというお言葉に勇気付けられました。 ローマは一日にして成らないですよね。 少し考えてみます。 それで分からなかったらまたお願いします。 ありがとうございました。

関連するQ&A

  • セッション管理

    度々の質問で申し訳ないです…。 「セッション管理」がどうしてもよく分かりません。 書籍やWeb上でいろんな説明を読んで頭では理解したつもりなんですが 実際使う段になるとつまづいてしまいます。 そこで質問です。 html → Servlret1 → JSP1 → Servlet1 → JSP2 → JSP3 このような遷移の中でセッション管理を行いたいと思っています。 今、JSP2までは無事にセッションオブジェクトに保存されたデータを 参照することができていますが、JSP2からJSP3に移るときに nullが渡されてしまうのです。 一度、Servlet1 へ制御を戻さなければだめなのでしょうか? 具体的なコードを以下に掲載します。 よろしくお願いします。 ========= Servlet1 でセッション開始 //セッションを得る HttpSession thisSession = req.getSession(true); //セッションに保存 req.getSession(false).setAttribute("Login","true"); ========= JSP2 で受け取る /* ここではちゃんと"true"が返ってきます。 */ //セッションオブジェクトから取り出す String login = (String)request.getSession(false).getAttribute("Login"); ========= JSP3 で受け取る /* ここで null が帰ってきてしまいます。 String login = (String)request.getSession(false).getAttribute("Login");

  • Servlet-JSP のセッション管理

    すいません。 セッションというものを使ってみたいなと思い、 本などを、見よう見真似で下のようなものを作ってみましたが、 まったく動きません。どこがいけませんか? ーーservlet-ー HttpSession session = req.getSession(); if (session.isNew()) {  session.setAttribute("test","ssm3u"); } ーーforwardされるJSP-ー <% HttpSession session = request.getSession(); %> <%= (String)session.getAttribute("test"); %> "ssm3u"と出したいのですが、全然違うのでしょうか? 自分ではCookieを利用するセッション管理を作ったつもりです・・

    • ベストアンサー
    • Java
  • Sessionについて

    今、JSPを用いてログイン画面を作成しているのですが、Sessionの使い方がいまいちわかりません。 HttpSession ses = request.getSession(); ses.setAttribute("id",id); これでSessionに格納するのはわかりますが Sessionから値を取り出す方法がわかりません。 どなたか助けてください

    • ベストアンサー
    • Java
  • struts2でのフィルターを使ったセッション管理

    はじめまして。 struts2,spring frameworkでソフトを作ってますが、セッション管理について質問があります。 1.ログイン画面で、ログイン後にセッションidを登録する。 session.setAttribute (USER_HANDLE, user); 2.他の画面に移動する時に、セッションid(user)が格納されているか確認する。格納されていない場合は、ログイン画面に戻る。 という処理をする場合、actionごとに HttpSession session = request.getSession (true); Object user = session.getAttribute (USER_HANDLE); if (user != null) { //処理1 return true; } else { //処理2 return false; } と記述すると手間がかかるので、下記の様なFilterでまとめて管理できないかと考えているのですが、こういう考え方は一般的なのでしょうか? public class TestAccessFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST); HttpSession session = request.getSession (true); Object user = session.getAttribute (USER_HANDLE); if (user == null) { //処理1 return "login-success"; } else { //処理2 return "login"; } } actionごとにセッションidが格納されているか確認する代わりに、Filterでまとめて確認できないかということなのですが.... struts2でこういう書き方をして良いのかわからず困っています。 アドバイスをお願いいたします。

    • ベストアンサー
    • Java
  • 入力フォーム(JSP)にDB検索条件を入力し、データがなかった場合入力した値を残したままJSPに戻る方法を教えてください。

    基本的にはタイトルの質問なんですが、具体的な書き方がわかりません。 今作成しているのが TOP画面(JSP) ・入力フォームに検索条件 ↓ Servlet ・入力された条件でDB検索  何か検索されれば次画面へ遷移  何も検索されなければTOP画面へ戻る というものですが、 public class LoginCheck1 extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = response.getWriter(); String user = request.getParameter("user"); String pass = request.getParameter("pass"); HttpSession session = request.getSession(true); boolean check = authUser(user, pass); if (check){ /* 認証済みにセット */ session.setAttribute("login", "OK"); /* 本来のアクセス先へ飛ばす */ String target = (String)session.getAttribute("target"); response.sendRedirect(target); }else{ /* 認証に失敗したら、ログイン画面に戻す */ session.setAttribute("status", "Not Auth"); response.sendRedirect("/auth/Login"); } } protected boolean authUser(String user, String pass){ /* 取りあえずユーザー名とパスワードが入力されていれば認証する */ if (user == null || user.length() == 0 || pass == null || pass.length() == 0){ return false; } return true; } } サーブレットはこんな感じで書いてるんですが、 response.sendRedirect("/auth/Login"); の部分が悪いんでしょうか?

    • ベストアンサー
    • Java
  • セッションを使ったint型の値の保持

    こんにちは。 少し文が長いですがよろしくお願いします。 AccessのDBから取得したint型の値を、セッションを使って保持したいのですが while(rs.next()){ String name = rs.getString("NAME"); int value = rs.getInt("VALUE"); HttpSession session1 = req.getSession(true); HttpSession session2 = req.getSession(true); session1.setAttribute("Name", name); session2.setAttribute("Value", value); dispatcher2.include(req, res); } のコードの session2.setAttribute("Value", value); でコンパイルエラー DBAccess.java [37:1] javax.servlet.ServletRequest の setAttribute(java.lang.String,java.lang.Object) は (java.lang.String,int) に適用できません。 がでてうまくいきません。 セッションを使ってint型の値の保持を行うにはどうすればよいのでしょうか?

    • ベストアンサー
    • Java
  • 入力フォーム(JSP)にDB検索条件を入力し、データがなかった場合入力した値を残したままJSPに戻る方法を教えてください。

    基本的にはタイトルの質問なんですが、具体的な書き方がわかりません。 今作成しているのが TOP画面(JSP) ・入力フォームに検索条件 ↓ Servlet ・入力された条件でDB検索  何か検索されれば次画面へ遷移  何も検索されなければTOP画面へ戻る というものですが、 public class LoginCheck1 extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = response.getWriter(); String user = request.getParameter("user"); String pass = request.getParameter("pass"); HttpSession session = request.getSession(true); boolean check = authUser(user, pass); if (check){ /* 認証済みにセット */ session.setAttribute("login", "OK"); /* 本来のアクセス先へ飛ばす */ String target = (String)session.getAttribute("target"); response.sendRedirect(target); }else{ /* 認証に失敗したら、ログイン画面に戻す */ session.setAttribute("status", "Not Auth"); response.sendRedirect("/auth/Login"); } } protected boolean authUser(String user, String pass){ /* 取りあえずユーザー名とパスワードが入力されていれば認証する */ if (user == null || user.length() == 0 || pass == null || pass.length() == 0){ return false; } return true; } } サーブレットはこんな感じで書いてるんですが、 期待する結果は アカウント 12345 パスワード abcde と入力してそれがDBに登録してなかった場合 アカウント 12345 パスワード abcde と入力値がそのままで戻って欲しいのですが 今は、 アカウント  パスワード     と消えて表示されます。 response.sendRedirect("/auth/Login"); の部分が悪いんでしょうか?

    • ベストアンサー
    • Java
  • セッション変数について

    セッション変数の扱いについて困っていることがあります。 ichiran.jspの画面(商品一覧表) りんご→nyuryoku.jsp?shohinmei=ringoへのリンク みかん→nyuryoku.jsp?shohinmei=mikanへのリンク nyuryoku.jsp String shohinmei=request.getParameter("shohinmei"); session.setAttribute("shohinmei",shohinmei); ... <form method="post" action="koushin.jsp"> ...入力フォーム </fotm> koushin.jsp HttpSession hs=request.getSession(true); String shohinmei=(String)hs.getAttribute("shohinmei"); データ更新のSQLをかける ichiran.jspの画面で 1.りんごを右クリックして新しいウィンドウで開く 2.みかんを右クリックして新しいウィンドウで開く 3.りんごの入力画面を開いているブラウザのSubmitをクリック ↓ 2の時点でsession変数shohinmeiにmikanが入っているので、 りんごのはずがみかんのほうに更新がかかってしまう。 りんごとみかんの入力画面を並列に開いたときに、 それぞれ別のセッションとして生成され、りんごとみかんに関するshohinmeiの 変数領域が別々に確保されるようにする方法はないものでしょうか?

    • ベストアンサー
    • Java
  • セッションIDの付け替えについて

    はじめまして。 Servlet でセッションIDの付け替えをしたいのですが、 HttpSession session = request.getSession(); out.println(session.getId()); session.invalidate(); HttpSession newSession = request.getSession(true); out.println(newSession.getId()); のように、 一度invalidate()してから、 新しいセッションを取得しても 同じセッションIDとなってしまいます。 違うセッションIDを振るにはどうしたらよいでしょうか。

  • セッションタイムアウト時にエラー画面を表示したい

    はじめまして。Java初心者です。 宜しくお願します。 具体的には、 1.セッション作成時(sessionCreated)に、 HttpServletrequest,HttpServletresponse  をHttpsession setAttributeでセットしてあげる。 2.セッション削除時(sessionDestroyed)に、 1.でセットしたrequest,response  をHttpsession getAttributeで取得する。  2-1 エラー画面へforwardする。 2.のソースはいかのように行っていますが、forwardのところで nullpointer.exceptionでうまくいきません。 public void sessionDestroyed(HttpSessionEvent event){ HttpSession session = event.getSession(); /* request,responseオブジェクト取得*/ HttpServletRequest request = (HttpServletRequest)session.getAttribute("request"); HttpServletResponse response = (HttpServletResponse)session.getAttribute("response"); try { // エラー画面表示 request.getRequestDispatcher("/err.jsp").forward(request,response); } catch (ServletException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); System.out.println(e.getStackTrace()); } } ご存知の方がいらっしゃいましたらご教授願います。 また、方法が基本的におかしいというアドバイスでも構いません ので宜しくお願します。 OS:windows2000 tomcat:5.0 eclipse:3.0

    • ベストアンサー
    • Java

専門家に質問してみよう