17
17
package org .springframework .web .socket .server .jetty ;
18
18
19
19
import java .io .IOException ;
20
+ import java .lang .reflect .Method ;
20
21
import java .security .Principal ;
21
22
import java .util .ArrayList ;
22
23
import java .util .List ;
23
24
import java .util .Map ;
24
25
26
+ import javax .servlet .ServletContext ;
25
27
import javax .servlet .http .HttpServletRequest ;
26
28
import javax .servlet .http .HttpServletResponse ;
27
29
42
44
import org .springframework .http .server .ServletServerHttpRequest ;
43
45
import org .springframework .http .server .ServletServerHttpResponse ;
44
46
import org .springframework .util .Assert ;
47
+ import org .springframework .util .ClassUtils ;
45
48
import org .springframework .util .CollectionUtils ;
49
+ import org .springframework .web .context .ServletContextAware ;
46
50
import org .springframework .web .socket .WebSocketExtension ;
47
51
import org .springframework .web .socket .WebSocketHandler ;
48
52
import org .springframework .web .socket .adapter .jetty .JettyWebSocketHandlerAdapter ;
59
63
* @author Rossen Stoyanchev
60
64
* @since 4.0
61
65
*/
62
- public class JettyRequestUpgradeStrategy implements RequestUpgradeStrategy , Lifecycle {
66
+ public class JettyRequestUpgradeStrategy implements RequestUpgradeStrategy , Lifecycle , ServletContextAware {
67
+
68
+ // Pre-Jetty 9.3 init method without ServletContext
69
+ private static final Method webSocketFactoryInitMethod =
70
+ ClassUtils .getMethodIfAvailable (WebSocketServerFactory .class , "init" );
63
71
64
72
private static final ThreadLocal <WebSocketHandlerContainer > wsContainerHolder =
65
73
new NamedThreadLocal <WebSocketHandlerContainer >("WebSocket Handler Container" );
@@ -69,6 +77,8 @@ public class JettyRequestUpgradeStrategy implements RequestUpgradeStrategy, Life
69
77
70
78
private volatile List <WebSocketExtension > supportedExtensions ;
71
79
80
+ private ServletContext servletContext ;
81
+
72
82
private volatile boolean running = false ;
73
83
74
84
@@ -94,7 +104,6 @@ public Object createWebSocket(ServletUpgradeRequest request, ServletUpgradeRespo
94
104
// Cast to avoid infinite recursion
95
105
return createWebSocket ((UpgradeRequest ) request , (UpgradeResponse ) response );
96
106
}
97
-
98
107
// For Jetty 9.0.x
99
108
public Object createWebSocket (UpgradeRequest request , UpgradeResponse response ) {
100
109
WebSocketHandlerContainer container = wsContainerHolder .get ();
@@ -128,6 +137,11 @@ private List<WebSocketExtension> getWebSocketExtensions() {
128
137
return result ;
129
138
}
130
139
140
+ @ Override
141
+ public void setServletContext (ServletContext servletContext ) {
142
+ this .servletContext = servletContext ;
143
+ }
144
+
131
145
@ Override
132
146
public boolean isRunning () {
133
147
return this .running ;
@@ -139,7 +153,12 @@ public void start() {
139
153
if (!isRunning ()) {
140
154
this .running = true ;
141
155
try {
142
- this .factory .init ();
156
+ if (webSocketFactoryInitMethod != null ) {
157
+ webSocketFactoryInitMethod .invoke (this .factory );
158
+ }
159
+ else {
160
+ this .factory .init (this .servletContext );
161
+ }
143
162
}
144
163
catch (Exception ex ) {
145
164
throw new IllegalStateException ("Unable to initialize Jetty WebSocketServerFactory" , ex );
0 commit comments