shiro:每次页面request,SecurityUtils.getSubject() 返回不同的值
@eyelee 你好,想跟你请教个问题:
jfinal整合shiro,shiro权限的使用中,每次页面request,SecurityUtils.getSubject() 得到的subject 不一样,
SecurityUtils.java
public static Subject getSubject() {
Subject subject = ThreadContext.getSubject();
if (subject == null) {
subject = (new Subject.Builder()).buildSubject();
ThreadContext.bind(subject);
}
return subject;
}
ThreadContext.java
public static final String SUBJECT_KEY = ThreadContext.class.getName() + "_SUBJECT_KEY";
public static Subject getSubject() {
return (Subject) get(SUBJECT_KEY);
}
因为每次页面过来的request都会是一个不同的thread,所以 SUBJECT_KEY 不一样,得到subject不一样, 权限检测这样就出问题了,subject是按线程保持,shiro有自定义的subject可以线程共享,但仍没搞明白,如何同一用户取到一样的subject?谢谢~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
请教下:如果我需要在public void sessionDestroyed(HttpSessionEvent arg0)方法里获取Subject该如何弄呢?
在Controller里获取没问题,就是在HttpSessionListener里就取不到。
目前获取不到,总是Null
也尝试过org.apache.shiro.session.SessionListener实现会话监听,一直没弄成功,测试发现只有onStart被触发,onExpiration,onStop没动静,等等会话过期之后,刷新页面就获取不到会话数值导致出错
我这个是官方文档给出的~~~
多个用户登录,每个用户拿到的subject,都是被最后一个用户给改写。。。加bind()改也是错的。。
学习
经验学习
啊,官方文档我看的不够仔细吧。谢谢~
@eyelee
Subject subject = ThreadContext.getSubject(); 这个试试~~
ThreadContext.bind(SecurityUtils.getSubject()); Subject suject = SecurityUtils.getSubject(); 可以得到同一个subject了。
引用来自“eyelee”的答案
嗯,参考的,非常感谢
@JFinal ,
@玛雅牛
介绍两篇关于 jfinal 整合 shiro 的博文给你:
http://my.oschina.net/myaniu/blog/137205
http://my.oschina.net/myaniu/blog/137198
@玛雅牛
这段代码放在哪里?只是获取的地方用吗?只是获取的地方不行啊,还是拿到的不同,只有相同的线程id才能拿到,我已经崩溃了。。。
问题在这里。
回复
我说我咋没碰到过呢,原来是顺序问题
@andylive 这一段放在最上面,在JFinal 之前