2 zmztxzs zmztxzs 于 2018.01.22 17:05 提问

Spring Boot配置Session监听无效。 40C

我有一个spring boot (v1.5.9.RELEASE)项目,想要对session进行管理/监听,实现了HttpSessionListener和HttpSessionAttributeListener这两个接口,在MySessionListener中使用@WebListener注解,在启动类中使用@SpringBootApplication注解
但是经过测试,访问网页(ftl页面)无法触发sessionCreated()方法,session过期时也无法触发sessionDestroyed()方法;用户登陆时调用request.getSession().setAttribute()或者session().setAttribute()都无法触发attributeAdded()方法。

程序启动时可以输出构造方法中的内容
2018-01-22 18:02:49.761 INFO 35600 --- [ost-startStop-1] c.t.x.c.listener.MySessionListener : MySessionListenerInitialized

请问有人知道这是为什么吗

代码如下:

DemoApplication.java

    @SpringBootApplication
    @ServletComponentScan
    public class DemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }

MySessionListener.java

    @WebListener
    public class MySessionListener implements HttpSessionListener, HttpSessionAttributeListener {
        private final static Log log = LogFactory.getLog(MySessionListener.class);
        // 程序启动时可以在控制台中输出这句话
        public MySessionListener() { 
            log.info("MySessionListenerInitialized"); 
        }
        @Override
        public void sessionCreated(HttpSessionEvent se) {
            log.info("sessionCreated-----" + se.getSession().getId());
        }
        @Override
        public void sessionDestroyed(HttpSessionEvent se) {
            log.info("sessionDestroyed-----" + se.getSession().getId());
        }
        @Override
        public void attributeAdded(HttpSessionBindingEvent se) {
            log.info("attributeAdded: "+se.getSession().getId());
        }
        @Override
        public void attributeRemoved(HttpSessionBindingEvent se) {
            log.info("attributeRemoved: "+se.getSession().getId());
        }
        @Override
        public void attributeReplaced(HttpSessionBindingEvent se) {
            log.info("attributeReplaced: "+se.getSession().getId());
        }
    } 

还有就是使用springbean的配置方式同样无效

    @Configuration
    public class MyWebConfiguration extends WebMvcConfigurerAdapter {
        @Bean
        public ServletListenerRegistrationBean<EventListener> sessionListener() {
            ServletListenerRegistrationBean<EventListener> sessionListener = new ServletListenerRegistrationBean<>();
            sessionListener.setListener(new MySessionListener());
            return sessionListener;
        }
    }

3个回答

weixin_40403614
weixin_40403614   2018.01.22 17:10

怎么没看到你写的判断分支语句?

zmztxzs
zmztxzs 能详细的说一下吗?
大约一个月之前 回复
li_ling_ren
li_ling_ren   2018.01.22 17:55

1.你可以先看一下你的监听有没有进行实例化
2.如果没有实例化有问题就很正常了,这时候你需要配置一下你包的扫描路径
希望可以帮到你

qq_39335302
qq_39335302 回复zmztxzs: 请问你的问题解决了吗
21 天之前 回复
li_ling_ren
li_ling_ren 回复zmztxzs: 这个问题解决了能告诉我一下吗,很纳闷啊
大约一个月之前 回复
li_ling_ren
li_ling_ren 回复zmztxzs: 定义无参构造没有问题的,日志打了说明,你的监听器正常初始化了
大约一个月之前 回复
zmztxzs
zmztxzs 在启动项目时控制台打印了这句话 2018-01-22 18:02:49.761 INFO 35600 --- [ost-startStop-1] c.t.x.c.listener.MySessionListener : MySessionListenerInitialized
大约一个月之前 回复
zmztxzs
zmztxzs public MySessionListener() { log.info("MySessionListenerInitialized"); }
大约一个月之前 回复
zmztxzs
zmztxzs 你好,感谢你的回答,我在MySessionListener中自定义了无参的构造方法
大约一个月之前 回复
wangb_java
wangb_java   2018.01.22 18:07

1。在MySessionListener 中加个初始化块,看启动时能不能打印出来
{

System.out.println("初始化块");

}
2。在setAttribute()方法前面打印点东西,确认这个方法是否真的执行了

zmztxzs
zmztxzs 感谢你的回答,我在MySessionListener中自定义了无参的构造方法public MySessionListener() { log.info("MySessionListenerInitialized"); },在启动程序时控制台输出了这句话:2018-01-22 18:02:49.761 INFO 35600 --- [ost-startStop-1] c.t.x.c.listener.MySessionListener : MySessionListenerInitialized
大约一个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!