前文
在将 spring boot
应用部署到独立的tomcat服务器时
,会因为@ServletComponentScan注解不起作用
,从而导致以注解形式注入的监听器、过滤器以及 Servlet 注入失败(因为独立Tomcat采用的是容器内建的discovery机制),最终导致项目启动失败,为了避免这一情况,最好以 @Bean
的形式注册相关servlet
示例
注册 Session 监听器
首先实现 HttpSessionListener 来定义一个 session 监听器,注意,这里将不再使用 @WebListener 注解
// @WebListener // 因为需要在独立的tomcat中部署,所以改为采用ServletListenerRegistrationBean来注册监听器
public class SessionHandler implements HttpSessionListener {
@Resource
private ILoginLogService loginLogService;
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("session created");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("session Destroyed");
UserDetailsBean user = (UserDetailsBean) httpSessionEvent.getSession().getAttribute("user-detail");
if (user != null && loginLogService != null) {
LoginLog lastLogByUserId = loginLogService.getLastLogByUserId(user.getId());
lastLogByUserId.setLogoutTime(new Date());
loginLogService.update(lastLogByUserId);
}
}
}
然后在一个配置类中对定义的监听器类进行注册
@Bean
public ServletListenerRegistrationBean sessionHandler() {
return new ServletListenerRegistrationBean<>(new SessionHandler());
}
通过以上方式,可以有效解决 @ServletComponentScan
在独立容器中失效的问题
网友评论