単純シミュレーションtomcat環境テストHttpSessionBindingListener実装効果


HttpSessionBindingListenerインタフェースは、多くの場合、オンラインユーザー数の統計および管理に使用されます.言うまでもなく、sessionは必要ですが、tomcatを起動してwebプログラムを実行してその効果をテストしたくありません.ではtomcat自身のjarパッケージを直接呼び出してセッションを構築して私の目的を実現する方法はありませんか.例:
1.tomcatのjarを呼び出します.このパッケージはtomcatの実行時にリモートクライアントのhttpリクエストを受信するときに、HttpServertRequest、HttpServertResponse、HttpSessionなどよく知られているservlet APIの実装クラスを構築するために使用されます.今はHttpSessionインタフェースの実装だけが必要です.
2.HttpSessionのインスタンスを取得したら、sessionを使用できます.setAttribute()メソッドは、HttpSessionBindingListenerのインスタンスをセッションに入れ、セッションを呼び出す.removeAttribute()このプロパティを削除し、HttpSessionBindingListenerのインスタンスで対応するメソッドがトリガーされ、テストの目的が達成されるかどうかを確認します.
複数のテストにより,上記の手順が完全に実現できることを証明した.
一、まずtomcatインストールディレクトリの下にあるすべてのjarパッケージをプロジェクトに導入します(実際にはすべて必要ではありませんが、操作が簡単なためです).libおよびbinディレクトリの下に含まれています.
二、カスタムHttpSessionBindingListenerの実装クラス
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class MyBindingListener implements HttpSessionBindingListener {

	//                 
	private Object obj;

	public MyBindingListener(Object obj) {
		this.user = obj;
	}

	@Override
	public void valueBound(HttpSessionBindingEvent event) {
		System.out.println("hi...valueBound");
		// process obj
	}

	@Override
	public void valueUnbound(HttpSessionBindingEvent event) {
		System.out.println("hi...valueUnbound");
		// process obj
	}

}

三、Tomcatの中のHttpSession実現クラスを探す
実は比較的に簡単で、まずtomcatソースコードの対応するAPIドキュメントを見てみます
http://tomcat.apache.org/tomcat-7.0-doc/api/index.html
、sessionという接尾辞のパッケージ名を見つけます:org.apache.catalina.セッション、HttpSessionの実装クラスはStandardSessionとStandardSessionFacadeであり、事後テストでは、いずれもHttpSessionBindingListenerのリスニング効果を確認するために使用できます.しかし、好奇心を満たすためにtomcatを起動し、任意のdemoのページに<%=requestと書きました.getSession()%>tomcatのデフォルトで使用する実装を見て、orgを出力します.apache.catalina.session.StandardSessionFacade@1f6df4cじゃ、それを使いましょう.
次に、次のようにテストクラスを書きます.
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.session.StandardManager;
import org.apache.catalina.session.StandardSession;
import org.apache.catalina.session.StandardSessionFacade;
import org.junit.Test;

public class HttpSessionBindingListenerTest {

	@Test
	public void test() {
		StandardManager sm=new StandardManager();
		sm.setContainer(new StandardContext());//    
		StandardSession ss=new StandardSession(sm);//    session

		System.out.println(ss.isValid());
		ss.setValid(true);
		System.out.println(ss.isValid());

                //     session          session,
                //          session  
		StandardSessionFacade session=new StandardSessionFacade(ss);
//		StandardSession session=new StandardSession(sm);
//		session.setValid(true);
		System.out.println(session);

		MyBindingListener my=new MyBindingListener(new Object());

		session.setAttribute("my", my);
		try {
			Thread.currentThread().sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		session.removeAttribute("my");
	}
}

実行結果:
false
true
org.apache.catalina.session.StandardSessionFacade@1f6df4c
hi...valueBound
hi...valueUnbound

なお、簡便性を求めるため、MyBindingListenerクラスの属性は単にObjectタイプを使用しているだけであり、具体的には個人が業務を実現するために必要に応じて修正し、対応するトリガメソッドで対応する処理を行うことができる.
(著者ブログより:http://www.ichatter.cn/2013/05/24/587/)