1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.shiro.guice;
20
21 import com.google.inject.Key;
22 import com.google.inject.OutOfScopeException;
23 import com.google.inject.Provider;
24 import com.google.inject.Scope;
25 import org.apache.shiro.session.Session;
26 import org.apache.shiro.subject.Subject;
27 import org.apache.shiro.util.ThreadContext;
28
29
30
31
32 public class ShiroSessionScope implements Scope {
33 public <T> Provider<T> scope(final Key<T> key, final Provider<T> unscoped) {
34 return new Provider<T>() {
35 public T get() {
36 Subject subject = ThreadContext.getSubject();
37 if (subject == null) {
38 throw new OutOfScopeException("There is no Shiro Session currently in scope.");
39 }
40 Session session = subject.getSession();
41 T scoped = castSessionAttribute(session);
42 if (scoped == null) {
43 scoped = unscoped.get();
44 }
45 return scoped;
46 }
47
48 @SuppressWarnings({"unchecked"})
49 private T castSessionAttribute(Session session) {
50 return (T) session.getAttribute(key);
51 }
52
53 @Override
54 public String toString() {
55 return unscoped.toString();
56 }
57 };
58 }
59
60 @Override
61 public String toString() {
62 return "ShiroSessionScope";
63 }
64 }