標籤:title out ted 方法 sys get images 生效 hold
Session監聽類HttpSessionListener介紹及在listener裡取得request
servlet-api.jar中提供了監聽類HttpSessionListener,主要方法有兩個,sessionCreated、sessionDestroyed,根據方法名就能明白是監聽session的建立和銷毀.
首先不可避免的要在sessionCreated方法中想要取得request對象(進而取得使用者ip,瀏覽器等屬性),但是HttpSessionEvent顯然直接取不到request對象。
研究了下,發現spring(主要是context jar包)提供了監聽類:RequestContextListener,可直接配在web.xml中,通過這個監聽器,可以直接拿到request上下文。樣本如下:
Java代碼
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
System.out.println(request.getHeader("user-agent"));
--------------------------------
另外,在sessionCreated雖然能取得request對象,但千萬不能寫request.getSession(true)類似的方法,這樣會引起死迴圈,理由是sessionCreated監聽session被建立時,此時的session還沒有完全被建立,因為用request.getSession(true)並不能拿到我們想要的那個session執行個體(大家都知道request.getSession(true) 表示擷取session對象,若session不存在則會再建立)。
於是就會悲劇的陷入:監聽方法中用request取得session,沒拿到,建立session,監聽方法又生效,生效後繼續取得session,沒拿到,建立session... 這樣的迴圈中。
綜上,session執行個體應從HttpSessionEvent拿。
Session監聽類HttpSessionListener介紹及在listener裡取得request