1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.mortbay.terracotta.servlet;
16
17 import java.io.IOException;
18
19 import javax.servlet.ServletException;
20 import javax.servlet.http.Cookie;
21 import javax.servlet.http.HttpServletRequest;
22 import javax.servlet.http.HttpServletResponse;
23 import javax.servlet.http.HttpSession;
24
25 import org.mortbay.jetty.HttpConnection;
26 import org.mortbay.jetty.Request;
27 import org.mortbay.jetty.RetryRequest;
28 import org.mortbay.jetty.SessionManager;
29 import org.mortbay.jetty.servlet.SessionHandler;
30 import org.mortbay.log.Log;
31
32
33
34
35 public class TerracottaSessionHandler extends SessionHandler
36 {
37 public TerracottaSessionHandler()
38 {
39 }
40
41 public TerracottaSessionHandler(SessionManager manager)
42 {
43 super(manager);
44 }
45
46 @Override
47 public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException
48 {
49 setRequestedId(request, dispatch);
50
51 Request currentRequest = (request instanceof Request) ? (Request)request: HttpConnection.getCurrentConnection().getRequest();
52
53 SessionManager requestSessionManager = currentRequest.getSessionManager();
54 HttpSession requestSession = currentRequest.getSession(false);
55
56 TerracottaSessionManager sessionManager = (TerracottaSessionManager)getSessionManager();
57 Log.debug("SessionManager = {}", sessionManager);
58
59
60 if (sessionManager != requestSessionManager)
61 {
62
63 currentRequest.setSessionManager(sessionManager);
64 currentRequest.setSession(null);
65 }
66
67
68 if (sessionManager != null) sessionManager.enter(currentRequest);
69 try
70 {
71 HttpSession currentSession = null;
72 if (sessionManager != null)
73 {
74 currentSession = currentRequest.getSession(false);
75 if (currentSession != null)
76 {
77 if (currentSession != requestSession)
78 {
79
80 Cookie cookie = sessionManager.access(currentSession, request.isSecure());
81 if (cookie != null)
82 {
83
84 response.addCookie(cookie);
85 }
86 }
87 else
88 {
89
90 currentSession = currentRequest.recoverNewSession(sessionManager);
91 if (currentSession != null) currentRequest.setSession(currentSession);
92 }
93 }
94 }
95 Log.debug("Session = {}", currentSession);
96
97 getHandler().handle(target, request, response, dispatch);
98 }
99 catch (RetryRequest x)
100 {
101
102 HttpSession currentSession = currentRequest.getSession(false);
103 if (currentSession != null && currentSession.isNew())
104 currentRequest.saveNewSession(sessionManager, currentSession);
105
106 throw x;
107 }
108 finally
109 {
110 if (sessionManager != null)
111 {
112
113 HttpSession currentSession = currentRequest.getSession(false);
114 if (currentSession != null) sessionManager.complete(currentSession);
115
116 sessionManager.exit(currentRequest);
117 }
118
119
120 if (sessionManager != requestSessionManager)
121 {
122 currentRequest.setSessionManager(requestSessionManager);
123 currentRequest.setSession(requestSession);
124 }
125 }
126 }
127 }