この記事では、Springbootのプロジェクトでは、HTTPSESSIONLISTENERリスナー(リスナーの1人)を使用して、オンラインの人数を数えます。これは、基本的にセッションの数を数えることです。
アイデアは非常にシンプルですが、私が処理しなかった詳細があるので、バグを完了する前に1日以上デバッグしました。
最初にhttpsessionListenerリスナーを書きます。カウントはセッションの数(人数)です。セッションが作成されると、リスナーのセッション作成方法がトリガーされます。セッションが破壊されると、リスナーのセッションが装備されたメソッドがトリガーされます。リスナーの人数を計算した後、それをServletContextに入れます(リクエストが保存して内部のプロパティを取得できるリポジトリとして理解できます)。
@weblistenerをリスナーに追加することに注意してください。そのため、構成する必要はありません。
@weblistener public class onlinecount httpssessionlistener {public int count = 0; //セッションの数を記録する//セッションの作成を聞きます。 count ++; arg0.getSession()。getServletContext()。setAttribute( "count"、count); } @Override public synchronized void sessiondestroyed(httpsessionevent arg0){// repeats sessionのrepeats system.out.println( "カウント - ; arg0.getSession()。getServletContext()。setAttribute( "count"、count); }}次に、セッションの数を照会するコントローラーを書きます。私は次のことから始めました、それは間違っています!
ServletContextからカウントを取得し、フロントエンドにカウントを返します。
@RequestMapping( "/count")@responsebody public string count(httpservletrequest、httpservletrequest、httpservletresponse httpservletresponse){object count = httpservletrequest.getservletcontext()。 "count:"+count; }これは間違っています。セッションが作成されないため、ページはそのカウントがnullであると見えることがわかります。また、リスナーをトリガーする統計的方法はありません。だからそれを変更してください:
@Controller Public Class IndexController {@RequestMapping( "/count")@responsebody public string count(httpservletrequest httpservletrequest、httpservletresponse httpservletresponse){httpsession session = httpservletrequest.getsession(); Object count = session.getServletContext()。getAttribute( "count"); "count:"+count; }} httpsession session = httpservletrequest.getSession();関数:ユーザーがセッションを持っていない場合、セッションを作成し、セッションがある場合、それを作成しません。
このテストに変更するのは正しいようですが、問題があります。ブラウザはセッションに対応します。 2つのブラウザを開くと、カウントが2であることがわかります。これは正しいです。ただし、ブラウザを閉じて開くと、2であり、変更されていないままになりますが、3になります。その理由は、セッション破壊方法が実行されないためです。再開すると、サーバーはユーザーの元のセッションを見つけてセッションを再作成できません。そのため、3つのセッションがありますが、ブラウザは2つしかありません。つまり、シミュレーションにはオンラインで2人しかいないはずです。
この問題を解決するには、2つの方法があります。 1つは、Webページを閉じるときにセッションを破壊する方法を呼び出すことです。もう1つの良い方法は、サーバーが元のセッションを覚えておくこと、つまりブラウザに元のSessionIDを記録し、次回開くときにセッションIDを送信して、サーバーが再作成されないようにすることです。
コードは次のように変更されます。
@Controller Public Class IndexController {@RequestMapping( "/count")@responsebody public string number(httpservletrequest、httpservletrequest、httpservletresponse httpservletresponse){try {// {// browser cusitie c = new cosionid " urlencoder.encode(httpservletrequest.getSession()。getId()、 "utf-8")); C.SetPath( "/"); // Cookieの有効期間を最初に2日間設定してください。心配しないでください。セッションは2日間保存されません。C.SetMaxage(48 * 60 * 60); httpservletresponse.addcookie(c); } catch(Exception e){e.printstacktrace(); } httpsession session = httpservletrequest.getSession(); Object count = session.getServletContext()。getAttribute( "count"); "count:"+count; }}要約します
上記は、モニターを使用したスプリングブートのケース分析で、編集者が紹介したオンラインユーザーをカウントします。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!