Session監聽類HttpSessionListener介紹及在listener里取得request
servlet-api.jar中提供了監聽類HttpSessionListener,主要方法有兩個,sessionCreated、sessionDestroyed,根據方法名就能明白是監聽session的創建和銷毀.
首先不可避免的要在sessionCreated方法中想要取得request對象(進而取得用戶ip,瀏覽器等屬性),但是HttpSessionEvent顯然直接取不到request對象。
研究了下,發現spring(主要是context jar包)提供了監聽類:RequestContextListener,可直接配在web.xml中,通過這個監聽器,可以直接拿到request上下文。示例如下:
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拿。