Spring依赖注入servlet会话监听器
2024-10-18 11:06:34
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”文件中。
- 注册“ContextLoaderListener”作为第一个监听器,使Web应用程序知道Spring上下文加载程序。
- 配置“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创建和销毁的方法,那么就需要你根据相应的情景去处理,来得到你想要的结果了。
最新文章
- LDR详解
- PCB的封装尺寸
- PhpStorm设置编码
- canvas作为背景
- c++中typename和class的区别介绍
- onethink常用标签的使用示例
- ECSHOP Inject PHPCode Into \library\myship.php Via \admin\template.php &;&; \includes\cls_template.php Vul Tag_PHP_Code Execute Getshell
- HADOOP :: java.lang.ClassNotFoundException: WordCount
- Bootstrap_Javascript_弹窗
- Suricata, to 10Gbps and beyond(X86架构)
- POJ 2305 Basic remains(进制转换)
- Node.js的安装以及Node.js的模块管理
- 版本控制commit和update过程
- hyperscan在低版本系统应用问题
- Web笔记(二)Tomcat 使用总结
- mysql如何从全备文件中恢复单个库或者单个表
- 重新设计导出API
- VMMAP的简单使用
- 认真学习Linux系统让你真的有收获
- Tomcat8.5配置https启动报空指针错误
热门文章
- https的加密解密是怎么写的?
- 第8章 信号(6)_贯穿案例2:mini shell(3)
- linux read 系统调用剖析
- 使用 xhprof 进行性能分析
- Latex Error:‘acmart.cls’ not found 解决方案:
- archlinux上安装sublime text
- [python爬虫] 爬取图片无法打开或已损坏的简单探讨
- maven项目中的报错问题——Dynamic Web Module 3.0 requires Java 1.6 or newer.
- 23.OGNL与ValueStack(VS)-调用普通类的构造方法
- AS3获取对象类名,getDefinitionByName,getQualifiedClassName,getQualifiedSuperclassName