Spring Boot 之 session监听器

参考:https://www.cnblogs.com/nyhhd/p/12684177.html

session存在服务端,session监听器可以用来跟踪session的生命周期。spring-boot项目越来越流行,我就记录下spring boot项目中使用session监听器的过程,以便以后参考。

spring boot使用监听器非常方便,使用这2个注解就可自动加载注册了:@WebListener和@ServletComponentScan

首先在springboot启动类SpringBootApplication 上使用@ServletComponentScan注解。然后使用@WebListener声明监听器。
SpringBootApplication 上使用@ServletComponentScan 注解后
Servlet可以直接通过@WebServlet注解自动注册
Filter可以直接通过@WebFilter注解自动注册
Listener可以直接通过@WebListener 注解自动注册

在启动类上使用@ServletComponentScan,就可以自动扫描使用@WebServlet、@WebFilter和@WebListener注解的类完成自动注册。

1.编写session监听器类实现HttpSessionListener接口,并加上@WebListener注解,声明此类是一个监听器。

@WebListener
public class OpOnlineUserSessionListener  implements HttpSessionListener {

    /**
     * session被销毁时触发,如下情况
     * 		1.主动调用session.invalidate()
     * 		2.session超时
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        HttpSession session = event.getSession();
        //获取当前用户信息
        Params params  = (Params)session.getAttribute("userName");
        //移除在线用户
        if(params!= null && StringUtils.isNotEmpty(params.getUsername())){
            LoginOperateInfo loginInfo = new LoginOperateInfo();
            //为0代表不是登录状态
            loginInfo.setIsLogin(LoginStatusEnum.OFF_LINE.getCode());
            loginInfo.setSessionId(session.getId());
            //为2代表操作类型为登出
            loginInfo.setOperateType(LoginStatusEnum.LOGIN_OUT.getCode());
            loginInfo.setUserId(params.getUserId());
            loginInfo.setUserNo(params.getUsername());
            loginInfo.setUserName(params.getUserNameCN());
            int count = updateIsLogin(session.getId());
            if(count>0){
                insertLoginOperateInfo(loginInfo);
            }
        }
    }

    //session被创建时触发
    @Override
    public void sessionCreated(HttpSessionEvent event) {
        /*HttpSession session = event.getSession();
        Params params1  = (Params)session.getServletContext().getAttribute("userName");
        //获取当前用户信息
        Params params  = (Params)session.getAttribute("userName");
        //添加在线登录记录
        if(params!= null && StringUtils.isNotEmpty(params.getUsername())){
            LoginOperateInfo loginInfo = new LoginOperateInfo();
            //为1代表是登录状态
            loginInfo.setIsLogin(1);
            loginInfo.setSessionId(session.getId());
            //为1代表操作类型为登陆
            loginInfo.setOperateType(1);
            loginInfo.setUserId(params.getUserId());
            loginInfo.setUserNo(params.getUsername());
            loginInfo.setUserName(params.getUserNameCN());
            insertLoginOperateInfo(loginInfo);
        }*/
    }

    /**
     * 登录登出操作记录表
     * @param loginInfo
     */
    private void insertLoginOperateInfo(LoginOperateInfo loginInfo){
        loginInfo.setOperateTime(new Date());
        loginInfo.setCreateTime(new Date());
        ICASUserDao userDao = SpringContextUtil.getBean(ICASUserDao.class);
        userDao.insertLoginOperate(loginInfo);
    }

    /**
     * 根据sessionId更新用户登录状态
     * @param sessionId
     */
    private int updateIsLogin(String sessionId){
        ICASUserDao userDao = SpringContextUtil.getBean(ICASUserDao.class);
        return userDao.updateIsLogin(sessionId);
    }

}

2.启动类上使用@ServletComponentScan,自动扫描带有(@WebServlet, @WebFilter, and @WebListener)注解的类,完成注册。

package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.boot.web.servlet.ServletComponentScan;


@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})//无数据库运行
@ServletComponentScan //scans from the package of the annotated class (@WebServlet, @WebFilter, and @WebListener) 
public class WebApp{
     public static void main(String[] args) {
         System.out.println(" springApplication run !");
         SpringApplication.run(WebApp.class,args);
    }
     
}

只用简单的2个注解就完成了session监听器的注册。这样就能监听到容器session的生命周期了。

注意:HttpServletRequest的getSession()方法,如果当前请求没有对应的session会自动创建session。

使用getSession(false)就不会创建session,如果没有当前请求对应的session就返回null.

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Spring Boot应用程序中接入SIP协议,需要使用一个Java SIP客户端库,例如JAIN-SIP(Java API for Integrated Networks Session Initiation Protocol)。以下是一些步骤: 1. 在Maven或Gradle中添加JAIN-SIP依赖项。 2. 创建一个SIP用户代理(User Agent),它充当SIP客户端并用于建立和终止SIP会话。 3. 配置SIP用户代理,包括SIP服务器地址和端口号、SIP用户ID和密码等。 4. 实现SIP监听器(SIP Listener),用于处理接收到的SIP请求和响应。 5. 在Spring Boot应用程序中使用SIP用户代理和SIP监听器,以便在应用程序中建立和终止SIP会话。 以下是一个示例代码片段,它使用JAIN-SIP库创建了一个SIP用户代理并实现了一个简单的SIP监听器: ```java public class MySipListener implements SipListener { // Implement SIP listener methods here } @Configuration public class SipConfig { @Bean public SipFactory sipFactory() { return SipFactory.getInstance(); } @Bean public SipStack sipStack(SipFactory sipFactory) throws PeerUnavailableException { Properties properties = new Properties(); properties.setProperty("javax.sip.STACK_NAME", "mySipStack"); return sipFactory.createSipStack(properties); } @Bean public SipProvider sipProvider(SipStack sipStack) throws ObjectInUseException { ListeningPoint listeningPoint = sipStack.createListeningPoint("0.0.0.0", 5060, "udp"); SipProvider sipProvider = sipStack.createSipProvider(listeningPoint); sipProvider.addSipListener(new MySipListener()); return sipProvider; } @Bean public SipFactory sipFactory() { return SipFactory.getInstance(); } @Bean public SipFactory sipFactory() { return SipFactory.getInstance(); } @Bean public SipFactory sipFactory() { return SipFactory.getInstance(); } } ``` 在上面的示例中,我们创建了一个SIP用户代理并将其配置为使用UDP传输协议和5060端口。我们还实现了一个简单的SIP监听器,并将其添加到SIP提供程序中。 这只是一个简单的示例,实际应用程序的设置可能会更加复杂。但是,这应该为您提供一个起点,以便在Spring Boot应用程序中接入SIP协议。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值