当关闭浏览器或session失效后自动触发事件执行自己的逻辑

最近项目需求:要求当关闭浏览器(关闭页签另说,比较复杂,这里挖个坑,到时候再填)或session失效后让用户自动退出,也就是此时要修改数据库用户状态。
如何做呢?这里用到session监听器。当session因各种原因失效后,监听器就可以监听到,然后执行监听器中定义好的程序就可以了
监听器类为:HttpSessionListener类,有sessionCreated和sessionDestroyed两个方法 。你自己自定义一个类,然后继承这个类(HttpSessionListener)就行。到时候session失效后就会执行sessionDestroyed方法

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.springframework.beans.factory.annotation.Autowired
import com.*.User;
import com.*.LoginService;

public class UserSessionListener implements HttpSessionListener{

	/*这里我没有用@Autowired	来装配LoginSesvice 实例。因为这样在这个类里面用不了。
	不能直接吧service注入进来。因为监听器(HttpSessionListener)属于sevlet容器,不属于spring框架管理范围。
	不能用spring的东西(@Autowried是spring的组件)
	这里我创建了一个InjectServiceUtil工具类,在项目启动时,对sevlet进行初始化,然后把service(loginService)注入,
	这里就可以直接使用了。
	另外当前类需要在web.xml中配置
	   	
	*/
	private static LoginSesvice loginService;
	@Override
	public void sessionCreated(HttpSessionEvect se){
		//TODO...
	}


	/*这篇文章要解决的问题核心就是下面这个方法
	---**关闭浏览器(关闭浏览器并不会销毁后台session,如有错误请指正)或session失效触发监听器执行我自己的逻辑**---,其他的注释以及InjectServiceUtil工具类作为扩展知识
	*/
	@Override
	public void sessionDestroyed(HttpsessionEvent se){
		//TODO执行自己的逻辑
		User user=(User)se.getSession().getAttribute("sessionNam");
		if(user!=null){
            //利用InjectServiceUtil工具类来获取loginService实例
	        loginService=InjectServiceUtil.getIVisitTotalService();
	        //修改数据库中用户的登录状态
			loginService.updateUsrIp(user.getUsrCd());
			
		}
	}
}

InjectServiceUtil类

import javax.annotation.PostConstruct;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
import com.*.LoginService;

//@Component配置一个bean,实例化到spring容器中。等于 <bean id="InjectServiceUtil" class=""></bean>
@Component("InjectServiceUtil")
public class InjectServiceUtil{
   @Autowired
   private LoginService loginService;
   /*@PostConstruct是Java自己的注解
     @PostConstruct该注解被用来修饰一个非静态的void()方法。
    被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。
    通常我们会是在Spring框架中使用到@PostConstruct注解 
    该注解的方法在整个Bean初始化中的执行顺序:
    Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
    应用:在静态方法中调用依赖注入的Bean中的方法。
   */
   @PostConstruct
   public void init(){
     InjectServiceUtil.getInstance().loginService=this.loginService;
   }
  //实现单例 开始
   private static class SingletonHolder{
		private static final InjectServiceUtil INSTANCE =new InjectServiceUtil();

   }
   private InjectServiceUtil(){};
   public static final InjectServiceUtil getInstance(){
      return SingletonHolder.INSTANCE ;
   }
   //实现单例 结束
   public static LoginService getIVisitTotalService(){
	  return InjectServiceUtil.getInstance().loginService;

   }
}

web.xml配置

<listener>
   <listener-class>com.HALO4.ODST.ForwardUntoDawn.SessionListener<listener-class>
</listener>
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页