谈谈用户登录信息与sessionAttributes

初学springMVC一直觉得sessionAttributes注解很不错,不用自己手动set就可以自动往session里添加数据。于是想到了使用在用户登录上。当初的想法很简单,就是在用户登录的时候使用sessionAttributes注解往session中放入username,然后在注销的时候invalidate。配置了一个springmvc拦截器,判断登录信息,如果有就放行,没有就sendRedirect到login.jsp页面。这个做的很顺利,没有碰到什么很大的问题,没有登录的时候使用查询功能跳转到了login.jsp,登录后就可以查询出数据了。正在沾沾自喜准备完成最后注销功能的时候出问题了,can't not create session on response completed!大致就是这个错误。这我就不明白,我什么时候去create session了?并且发现当我把invalidate改成remove后就不报错了,但logout后还是可以查询,我又不明白了!!!debug到interceptor中发现logout后session中的username还是有数据,神马情况?what happened...

这下傻了,到这里相信一般的童鞋都会去问度娘之类吧,不好意思,查下来没有人使用sessionAttributes做用户登录,至于为什么没有,这个也查不到!好吧,不用了吧。不行,我那倔脾气啊,我不能退缩啊。那南墙到了怎么办呢?最后又把logout改为invalidate,终于在springmvc源码中找到了答案。原来标注了sessionAttributes注解后springmvc会调用ServletRequestAttributes的setAttribute方法执行session.setAttribute(name, value);所以当我使用session.invalidate()后当然会报can't not create session了,改成removeAttribute后虽然不存在create session的问题但springmvc在执行中还是会调用session.setAttribute(name, value);所以,当我使用了sessionAttributes注解后即使我remove了后springmvc还会把它set进来,所以这个username的信息仍然会在session中。

终于,问题解决了,也就是说,使用session.invalidate()方法的类上是不能标注sessionAttributes的。另外提一点,在标注sessionAttributes注解的类中一定要有modelAttribute,使之在sessionAttributes注解调用前执行,不然的话你就要使用其他方法在request域中放入username信息,比如<mvc:exclude-mapping path="/login"/>。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值