zoukankan      html  css  js  c++  java
  • Spring依赖注入servlet会话监听器

    Spring提供了一个 “ContextLoaderListener” 监听器,以使 Spring 依赖注入到会话监听器。 在本教程中,通过添加一个 Spring 依赖注入一个bean 到会话监听器修改 HttpSessionListener 例子。

    1. Spring Beans

    创建一个简单的计数服务来打印创建的会话总数。

    File : CounterService.java

    package com.yiibai.common;
     
    public class CounterService{
     
    	public void printCounter(int count){
    		System.out.println("Total session created : " + count);
    	}
    
    }

    File : counter.xml – Bean配置文件(注:如果用的是spring注解就不需要这一步了)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    
    	<bean id="counterService" class="com.yiibai.common.CounterService" />
    	
    </beans>

    2. WebApplicationContextUtils

    使用“WebApplicationContextUtils”来获得 Spring 上下文,以后可以得到任何声明Spring的Bean 在一个正常的 Spring 方式。

    File : SessionCounterListener.java

    package com.yiibai.common;
     
    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    import org.springframework.context.ApplicationContext;
    import org.springframework.web.context.support.WebApplicationContextUtils;
     
    public class SessionCounterListener implements HttpSessionListener {
     
         private static int totalActiveSessions;
     
         public static int getTotalActiveSession(){
               return totalActiveSessions;
         }
     
        @Override
        public void sessionCreated(HttpSessionEvent arg0) {
               totalActiveSessions++;
               System.out.println("sessionCreated - add one session into counter");	
               printCounter(arg0);
        }
     
        @Override
        public void sessionDestroyed(HttpSessionEvent arg0) {
               totalActiveSessions--;
               System.out.println("sessionDestroyed - deduct one session from counter");	
               printCounter(arg0);
        }	
      
        private void printCounter(HttpSessionEvent sessionEvent){
    
              HttpSession session = sessionEvent.getSession();
    
              ApplicationContext ctx = 
                    WebApplicationContextUtils.
                          getWebApplicationContext(session.getServletContext());
    
              CounterService counterService = 
                          (CounterService) ctx.getBean("counterService");
    
              counterService.printCounter(totalActiveSessions);
        }
    }
    如果是用的spring注解,并没有手动声明bean的名称,则用CounterService counterService = (CounterService) ctx.getBean("CounterService");来实现

    3. 集成

    唯一的问题是,如何使 Web 应用程序知道在哪里可以加载 Spring bean 配置文件?秘诀是在“web.xml”文件中。
    1. 注册“ContextLoaderListener”作为第一个监听器,使Web应用程序知道Spring上下文加载程序。
    2. 配置“contextConfigLocation”,并定义Spring的bean配置文件。

    File : web.xml

    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
      
      <context-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>/WEB-INF/Spring/counter.xml</param-value>
      </context-param>
    
      <listener>
            <listener-class>
                org.springframework.web.context.ContextLoaderListener
            </listener-class>
      </listener>
    
      <listener>
    	<listener-class>
                com.yiibai.common.SessionCounterListener
            </listener-class>
      </listener>
    
      <servlet>
    	<servlet-name>Spring DI Servlet Listener</servlet-name>
    	<servlet-class>com.yiibai.common.App</servlet-class>
      </servlet>
     
      <servlet-mapping>
    	<servlet-name>Spring DI Servlet Listener</servlet-name>
    	<url-pattern>/Demo</url-pattern>
      </servlet-mapping>
      
    </web-app>

    File : App.java

    package com.yiibai.common;
     
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
     
    public class App extends HttpServlet{
     
      public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException{
    		
            HttpSession session = request.getSession(); //sessionCreated() is executed
            session.setAttribute("url", "yiibai.com"); 
            session.invalidate();  //sessionDestroyed() is executed
    		  
            PrintWriter out = response.getWriter();
            out.println("<html>");
            out.println("<body>");
            out.println("<h1>Spring Dependency Injection into Servlet Listenner</h1>");
            out.println("</body>");
            out.println("</html>");	
    		
       }
    } 

    启动Tomcat,并访问 URL “http://localhost:8080/7.2-SpringDemo/"

    输出结果

    sessionCreated - add one session into counter
    Total session created : 1
    sessionDestroyed - deduct one session from counter
    Total session created : 0
    看看控制台的输出,会得到通过 Spring DI 记数服务的 bean,并打印会话的总数。

    总结

    在Spring中,“ContextLoaderListener”是一个通用的方法集成Spring依赖注入到几乎所有的Web应用程序。
    虽然它的作用在大多数情况下是用来统计在线人数的,但是如果项目有其他需要也可以用它来实现,比如统计用户在线状态等。当然也有可能因为项目框架的原因,无论是登录或者退出(即session销毁)的时候
    都会走session创建和销毁的方法,那么就需要你根据相应的情景去处理,来得到你想要的结果了。
  • 相关阅读:
    路径规划算法总结
    常用滤波器整理
    Debian 9 strech 安装 ROS lunar
    understand 安装笔记
    protobuf 安装与卸载
    maven-surefire-plugin
    spring数据源、数据库连接池
    日志插件总结
    pom.xml常用元素解析
    BeanFactory笔记
  • 原文地址:https://www.cnblogs.com/yanduanduan/p/6524440.html
Copyright © 2011-2022 走看看