springbootはモニターでオンライン人数の実例を統計して分析します。


本文はspringbootのプロジェクトで、HttpSession Listenerモニターでオンライン人数を統計して、実質的にsessionの数を統計します。
 考え方は簡単ですが、細かいところをちゃんと処理していないので、長い間調整させて、やっとバグを完成させました。
 まずHttpSession Listenerモニターを書きます。count  sessionの数(人数)、セッション作成時にモニターのsession Createdメソッドをトリガし、sessionが破壊された時に、モニターのsession Destroyedメソッドをトリガします。モニターでカウントした人数のcountをservlet Contextに入れます。
 注意モニターに@WebListenerを加えると、配置しなくてもいいです。

@WebListener 
public class OnLineCount implements HttpSessionListener { 
  public int count=0;//  session    
  //  session   ,synchronized    bug 
  public synchronized void sessionCreated(HttpSessionEvent arg0) { 
    System.out.println("【HttpSessionListener   】count++   "); 
    count++; 
    arg0.getSession().getServletContext().setAttribute("count", count); 
  } 
  @Override 
  public synchronized void sessionDestroyed(HttpSessionEvent arg0) {//  session    
    System.out.println("【HttpSessionListener   】count--   "); 
    count--; 
    arg0.getSession().getServletContext().setAttribute("count", count); 
  } 
} 
続いて一つの検索セッションの数のcontrollerを書きます。私は最初に次のように書きました。間違いです。
countをservlet Contextから取り出し、countを先端に戻す。

@RequestMapping("/count") 
@ResponseBody 
public String count(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){ 
  Object count=httpServletRequest.getServletContext().getAttribute("count"); 
  return "count : "+count; 
} 
これは間違いです。テストで見つけます。ページにcountが見えます。  nullです。sessionを作成していないので、モニターをトリガする統計方法がありません。そこで改めます

@Controller 
public class IndexController { 
  @RequestMapping("/count") 
  @ResponseBody 
  public String count(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){ 
    HttpSession session = httpServletRequest.getSession(); 
    Object count=session.getServletContext().getAttribute("count"); 
    return "count : "+count; 
  } 
} 
 HttpSession session=http ServletRequest.get Session()  役割:このユーザはsesionがないとsessionを作成し、あるとsessionを取得して作成しません。
 このようにテストしたら正しいように見えますが、問題があります。一つのブラウザはsessionに対応しています。二つのブラウザを開けば、countが2であることが分かります。しかし、ブラウザを閉じて、再度開いたら、2不変であるべきですが、3になりました。理由はsession廃棄の方法が実行されていません。再オープンした時、サーバーはユーザーの元のsessionが見つからなくて、新たにsessionを作成しました。 
二つの方法でこの問題を解決できます。一つはホームページを閉じる時に先端から一つの方法を呼び出してsessionを廃棄します。もう一つのより良い方法は、サーバーに元のsessionIdをブラウザに記録し、次のオープン時にこのsessionIdを送ります。このようにサーバーは再作成されません。
コードの修正は以下の通りです。

@Controller 
public class IndexController { 
  @RequestMapping("/count") 
  @ResponseBody 
  public String number(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){ 
    try{ // sessionId       
      Cookie c = new Cookie("JSESSIONID", URLEncoder.encode(httpServletRequest.getSession().getId(), "utf-8")); 
      c.setPath("/"); 
      //   cookie    2 ,    ,session    2  
      c.setMaxAge( 48*60 * 60); 
      httpServletResponse.addCookie(c); 
    }catch (Exception e){ 
      e.printStackTrace(); 
    } 
    HttpSession session = httpServletRequest.getSession(); 
    Object count=session.getServletContext().getAttribute("count"); 
    return "count : "+count; 
  } 
} 
締め括りをつける
以上は小编で绍介したspringbootがモニターでオンライン人数の実例を统计して分析しました。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。