lombok是个好东西,能让代码变得非常简洁,常用的@Data
,@Getter
,@Setter
等注解,都能极大提高程序开发效率。但是当它和shiro相遇时,可能就是坑了。
最近使用shiro时,发现用户登录后,并没有执行授权动作,从而导致程序无法正常运行。经过测试,同一用户在不同机器登录后,后者就会出现此问题。经过跟踪调试,发现用户在多台机器登录时,如果之前没有退出,就能在shiro的缓存里获取到用户之前登录的授权信息。
这里就不写我是如何一步一步找问题的过程了,直接写结论。shiro会使用认证对象的hashcode作为key来缓存授权信息。因此同一用户,其认证对象hashcode是相同的,你问我为什么?,见代码,以下是我们程序中的用户认证对象的类:
@Data
public class UserSession{
.
.
.
}
在lombok的@Data
注解中,会重写当前对象的hashcode()
方法,最终的结果就是,如果两个对象的内容是完全一样的,那么他们的hashcode也会变的一样。这样在shiro中,当用重复登录时,shiro就会认为缓存中已经有了授权信息,从而出现问题。
找到了问题,解决方法就简单了,使用@Getter
和@Setter
替换掉原有的@Data
注解即可。