今天在SpringMVC项目中加入了一个Session监听事件,当在web.xml中注册后启动项目一直报异常,之后查证后发现,原来session监听类中不能进行依赖注入,而我同时又必须要用注入方式进行实例化,最终经过多次试验,终于解决了问题,下面是具体代码:
//记得 到web.xml中注册监听 public class SessionListenerLog implements HttpSessionListener, ServletRequestListener{ private HttpServletRequest request; //监听事件中 不能添加依赖注入 //@Resource(name="AuditLogServiceImpl") private AuditLogService auditLogService; @Override public void sessionCreated(HttpSessionEvent event) { //当client端访问server端jsp页面时,session也就创建了 //但并不意味着用户就已经登录,因此登陆日志不写在这 } @Override public void sessionDestroyed(HttpSessionEvent event) { //可将下面类中需要的类都进行依赖注入,非常方便 ApplicationContext ctx = ContextLoader.getCurrentWebApplicationContext(); auditLogService = (AuditLogService) ctx.getBean("AuditLogServiceImpl"); //但退出日志写在这里 //只要用户退出,理论上session需要被销毁 HttpSession session = event.getSession(); String LoginName = (String) session.getAttribute("sessionUserName"); StringBuilder sb = new StringBuilder(); //details 信息 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:dd:ss"); sb.append("退出时间: ").append(sdf.format(new Date())).append("\n"); sb.append("退出用户: ").append(LoginName).append("\n"); String detailsMsg = sb.toString(); if(detailsMsg.length() != 0 ){ String GUID = new RandomGUID().toString().replaceAll("-", ""); GUID = GUID.substring(1, GUID.length()-1); //记录日志基本信息 ZfSysLogBasicBean logBasic = auditLogService.insertZfSysLogOutBasic( request, "AJ", "", "LOGOUT", "", "100335", SessionListenerLog.class, GUID,LoginName); auditLogService.insertZfSysLogDetails(detailsMsg, logBasic); } } @Override public void requestInitialized(ServletRequestEvent requestEvent) { request = (HttpServletRequest) requestEvent.getServletRequest(); } @Override public void requestDestroyed(ServletRequestEvent requestEvent) { } }