. ~& s' t* w/ ^4 i这个Session对象是Shiro中特有的对象,它和我们经常使用的HttpSession非常相似,但还提供了额外的东西,其中与HttpSession最大的不同就是Shiro中的Session不依赖HTTP环境(换句话说,可以在非HTTP 容器下运行)。 . d4 R. `0 l5 h8 y( v# p7 Z1 H' H . ~3 i# \$ Q6 V2 S如果将Shiro部署在web应用程序中,那么这个Session就是基于HttpSession的。但是像QuickStart示例那样,在非web环境下使用,Shiro则默认使用EnterpriseSessionManagment。也就是说,不论在应用中的任何一层使用同样的API,却不需要考虑部署环境,这一优点为应用打开一个全新的世界,因为应用中要获取Session对象再也不用依赖于HttpSession或者EJB的会话Bean。而且任何客户端技术都可以共享session 数据。 * U% p) t8 T; g& ?, i5 Y/ L- q$ c: c
现在你可以得到当前Subject和它的Session对象。那么我们如何验证比如角色和权限这些东西呢? % M/ ?8 B# G! n+ q ' c3 r; V7 \* k0 H& I很简单,可以通过已得到的user对象进行验证。Subject对象代表当前用户,但是,谁才是当前用户呢?他们可是匿名用户啊。也就是说,必须登录才能获取到当前用户。没问题,这样就可以搞定:8 u' c( R4 q/ E7 u6 S1 P
8 M! \& }) v7 z* L3 ?/ p
if ( !currentUser.isAuthenticated() ) { R$ p" ~# G z- M P' P# w
0 ?. ^# H, L ^7 }, x# J. K" M: g//collect user principals and credentials in a gui specific manner 3 M3 W7 D# W3 }! B 0 U, D5 f) |* W% U//such as username/password html form, X509 certificate, OpenID, etc.( N) w2 m( ^9 u) @7 z M$ o) Q6 V
& ~2 |/ v5 w( ~8 P! H& P! w" }//We'll use the username/password example here since it is the most common. . R4 B* ?2 f8 |% ` - U t, w9 h2 t" ]- r//(do you know what movie this is from? ;) " l* W4 j; C; {' \( j1 ]6 {. R1 L & S# ]) s6 T4 ~1 h5 d) mUsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");% o6 a& C" Q) Q; h9 i
9 X* x# q# _& l: C" X//this is all you have to do to support 'remember me' (no config - built in!):+ ^3 p6 F, b4 O/ x
6 K+ W5 L( j6 j" ]: R% `: r
token.setRememberMe(true); W: W) Q+ Z: K 3 N1 [1 o0 V0 g% `( n8 C; `currentUser.login(token); 2 B) B& C7 m. Y* { 6 P. n" b/ p1 Z' b2 x# P8 N: J1 {2 B} K% I& z# p3 x+ l* U3 u8 | ( A. q3 R4 h& r就是这样,太简单了吧!; D* r; s- t1 r0 H3 D3 X/ p2 r
' }2 ^2 ~/ k8 i* e9 c8 U那登录失败了怎么处理呢?可以通过捕获各类异常,根据不同类型的异常做出不同的处理: |) v& C0 u' O- }
- M/ t h3 ^& w8 m
try { 3 G" u9 \8 y& _0 Z 7 `1 D0 Q& l# K- s. s0 q0 s9 PcurrentUser.login( token ); " t* N7 n3 g5 X8 X/ g% |2 B. q1 ~5 N
//if no exception, that's it, we're done!. ?* Z" k" z/ x
& \, `& W! O0 a6 V) a% O
} catch ( UnknownAccountException uae ) { % Q8 i' Z! x. q2 D ! o0 Q6 P2 Y% V# \" n& d8 S, B2 Z//username wasn't in the system, show them an error message?+ o: j3 Q; {6 O1 Q5 J
$ D2 R: E4 {$ D1 a5 T5 Y
} catch ( IncorrectCredentialsException ice ) {1 O* i, L& L% w9 N( ?. E