1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.session.infinispan;
20
21 import java.util.Random;
22 import java.util.concurrent.TimeUnit;
23
24 import javax.servlet.http.HttpServletRequest;
25 import javax.servlet.http.HttpSession;
26
27 import org.eclipse.jetty.server.Handler;
28 import org.eclipse.jetty.server.Server;
29 import org.eclipse.jetty.server.SessionManager;
30 import org.eclipse.jetty.server.handler.ContextHandler;
31 import org.eclipse.jetty.server.session.AbstractSession;
32 import org.eclipse.jetty.server.session.AbstractSessionIdManager;
33 import org.eclipse.jetty.server.session.SessionHandler;
34 import org.eclipse.jetty.util.log.Log;
35 import org.eclipse.jetty.util.log.Logger;
36 import org.infinispan.commons.api.BasicCache;
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 public class InfinispanSessionIdManager extends AbstractSessionIdManager
68 {
69 private final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session");
70 public final static String ID_KEY = "__o.e.j.s.infinispanIdMgr__";
71 public static final int DEFAULT_IDLE_EXPIRY_MULTIPLE = 2;
72 protected BasicCache<String,Object> _cache;
73 private Server _server;
74 private int _idleExpiryMultiple = DEFAULT_IDLE_EXPIRY_MULTIPLE;
75
76
77
78
79
80 public InfinispanSessionIdManager(Server server)
81 {
82 super();
83 _server = server;
84 }
85
86 public InfinispanSessionIdManager(Server server, Random random)
87 {
88 super(random);
89 _server = server;
90 }
91
92
93
94
95
96
97
98 @Override
99 protected void doStart() throws Exception
100 {
101 super.doStart();
102 }
103
104
105
106
107
108
109
110 @Override
111 protected void doStop() throws Exception
112 {
113 super.doStop();
114 }
115
116
117
118
119
120
121
122
123
124
125
126
127
128 @Override
129 public boolean idInUse(String id)
130 {
131 if (id == null)
132 return false;
133
134 String clusterId = getClusterId(id);
135
136
137
138 try
139 {
140 return exists(clusterId);
141 }
142 catch (Exception e)
143 {
144 LOG.warn("Problem checking inUse for id="+clusterId, e);
145 return false;
146 }
147
148 }
149
150
151
152
153
154
155
156
157 @Override
158 public void addSession(HttpSession session)
159 {
160 if (session == null)
161 return;
162
163
164
165
166
167 if (session.getMaxInactiveInterval() == 0)
168 insert (((AbstractSession)session).getClusterId());
169 else
170 insert (((AbstractSession)session).getClusterId(), session.getMaxInactiveInterval() * getIdleExpiryMultiple());
171 }
172
173
174 public void setIdleExpiryMultiple (int multiplier)
175 {
176 if (multiplier <= 1)
177 {
178 LOG.warn("Idle expiry multiple of {} for session ids set to less than minimum. Using value of {} instead.", multiplier, DEFAULT_IDLE_EXPIRY_MULTIPLE);
179 }
180 _idleExpiryMultiple = multiplier;
181 }
182
183 public int getIdleExpiryMultiple ()
184 {
185 return _idleExpiryMultiple;
186 }
187
188
189
190
191
192
193
194
195
196 @Override
197 public void removeSession(HttpSession session)
198 {
199 if (session == null)
200 return;
201
202
203 delete (((AbstractSession)session).getClusterId());
204 }
205
206
207
208
209
210
211
212 @Override
213 public void invalidateAll(String id)
214 {
215
216 delete (id);
217
218
219
220
221 Handler[] contexts = _server.getChildHandlersByClass(ContextHandler.class);
222 for (int i=0; contexts!=null && i<contexts.length; i++)
223 {
224 SessionHandler sessionHandler = ((ContextHandler)contexts[i]).getChildHandlerByClass(SessionHandler.class);
225 if (sessionHandler != null)
226 {
227 SessionManager manager = sessionHandler.getSessionManager();
228
229 if (manager != null && manager instanceof InfinispanSessionManager)
230 {
231 ((InfinispanSessionManager)manager).invalidateSession(id);
232 }
233 }
234 }
235
236 }
237
238
239
240
241
242
243
244
245 @Override
246 public void renewSessionId(String oldClusterId, String oldNodeId, HttpServletRequest request)
247 {
248
249 String newClusterId = newSessionId(request.hashCode());
250
251 delete(oldClusterId);
252 insert(newClusterId);
253
254
255
256 Handler[] contexts = _server.getChildHandlersByClass(ContextHandler.class);
257 for (int i=0; contexts!=null && i<contexts.length; i++)
258 {
259 SessionHandler sessionHandler = ((ContextHandler)contexts[i]).getChildHandlerByClass(SessionHandler.class);
260 if (sessionHandler != null)
261 {
262 SessionManager manager = sessionHandler.getSessionManager();
263
264 if (manager != null && manager instanceof InfinispanSessionManager)
265 {
266 ((InfinispanSessionManager)manager).renewSessionId(oldClusterId, oldNodeId, newClusterId, getNodeId(newClusterId, request));
267 }
268 }
269 }
270
271 }
272
273
274
275
276
277 public BasicCache<String,Object> getCache()
278 {
279 return _cache;
280 }
281
282
283
284
285
286 public void setCache(BasicCache<String,Object> cache)
287 {
288 this._cache = cache;
289 }
290
291
292
293
294
295
296
297
298 public void touch (String id)
299 {
300 exists(id);
301 }
302
303
304
305
306
307
308
309
310
311 protected boolean exists (String id)
312 {
313 if (_cache == null)
314 throw new IllegalStateException ("No cache");
315
316 return _cache.containsKey(makeKey(id));
317 }
318
319
320
321
322
323
324
325 protected void insert (String id)
326 {
327 if (_cache == null)
328 throw new IllegalStateException ("No cache");
329
330 _cache.putIfAbsent(makeKey(id), id);
331 }
332
333
334
335
336
337
338
339
340 protected void insert (String id, long idleTimeOutSec)
341 {
342 if (_cache == null)
343 throw new IllegalStateException ("No cache");
344
345 _cache.putIfAbsent(makeKey(id),id,-1L, TimeUnit.SECONDS, idleTimeOutSec, TimeUnit.SECONDS);
346 }
347
348
349
350
351
352
353
354 protected void delete (String id)
355 {
356 if (_cache == null)
357 throw new IllegalStateException ("No cache");
358
359 _cache.remove(makeKey(id));
360 }
361
362
363
364
365
366
367
368
369
370 protected String makeKey (String id)
371 {
372 return ID_KEY+id;
373 }
374 }