springbootはモニターでオンライン人数の実例を統計して分析します。
本文はspringbootのプロジェクトで、HttpSession Listenerモニターでオンライン人数を統計して、実質的にsessionの数を統計します。
考え方は簡単ですが、細かいところをちゃんと処理していないので、長い間調整させて、やっとバグを完成させました。
まずHttpSession Listenerモニターを書きます。count sessionの数(人数)、セッション作成時にモニターのsession Createdメソッドをトリガし、sessionが破壊された時に、モニターのsession Destroyedメソッドをトリガします。モニターでカウントした人数のcountをservlet Contextに入れます。
注意モニターに@WebListenerを加えると、配置しなくてもいいです。
countをservlet Contextから取り出し、countを先端に戻す。
このようにテストしたら正しいように見えますが、問題があります。一つのブラウザはsessionに対応しています。二つのブラウザを開けば、countが2であることが分かります。しかし、ブラウザを閉じて、再度開いたら、2不変であるべきですが、3になりました。理由はsession廃棄の方法が実行されていません。再オープンした時、サーバーはユーザーの元のsessionが見つからなくて、新たにsessionを作成しました。
二つの方法でこの問題を解決できます。一つはホームページを閉じる時に先端から一つの方法を呼び出してsessionを廃棄します。もう一つのより良い方法は、サーバーに元のsessionIdをブラウザに記録し、次のオープン時にこのsessionIdを送ります。このようにサーバーは再作成されません。
コードの修正は以下の通りです。
以上は小编で绍介したspringbootがモニターでオンライン人数の実例を统计して分析しました。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。
考え方は簡単ですが、細かいところをちゃんと処理していないので、長い間調整させて、やっとバグを完成させました。
まず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がモニターでオンライン人数の実例を统计して分析しました。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。