SpringSecurity的问题

wjn811 09-04-14

大家好。
本人最近在做一个关于BS的认证授权(一遇百年:))的问题。
我打算模仿SpringSecurity的几个认证的结构去做,顺便可以看一下它的源码。现在大致做出来了。
问题也就来了。

根据SpringSecurity的输出,HttpSessionContextIntegrationFilter是排在第一个的Filter。我发现它的功能就是从session里拿SecurityContext(如果有的话)。 然后再Set到当前的Thread里去(Set到ThreadLocalSecurityContextHolderStrategy里的ThreadLocal)。

然后doFilter做完后 再清空SecurityContext。并把改动保存到Session当中

我的问题是:
(1)既然当前线程可以从HttpSession中获得SecurityContext,为什么还要从ThreadLocal里拿呢?或者说为什么要把SecurityContext的一个引用也保存在当前线程当中呢?

(2)还有就是一次request的请求应该就代表一个用户线程对吧.我们在获得request的时候是不是也是从当前线程中获得的(web容器是不是就是这么做的)? 如果是的话,那为什么还要专门把SecurityContext放到当前线程中去呢?(又是第一个问题....)

请大家帮忙解答!谢谢各位

banq
2009-04-16 14:15

两个层次不一样,request httpsession是基于web容器,高层次,而threadlocal是基于线程底层次。

Web应用建议基于Web容器,框架因为不一定用在WEB,application也可能使用,所以基于线程。