最近项目需求:要求当关闭浏览器(关闭页签另说,比较复杂,这里挖个坑,到时候再填)或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>