1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.server.handler;
20
21 import java.io.IOException;
22
23 import javax.servlet.ServletException;
24 import javax.servlet.http.HttpServletRequest;
25 import javax.servlet.http.HttpServletResponse;
26
27 import org.eclipse.jetty.server.Request;
28 import org.eclipse.jetty.server.Server;
29 import org.eclipse.jetty.util.log.Log;
30 import org.eclipse.jetty.util.log.Logger;
31
32
33
34
35
36
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 ShutdownHandler extends AbstractHandler
68 {
69 private static final Logger LOG = Log.getLogger(ShutdownHandler.class);
70
71 private final String _shutdownToken;
72
73 private final Server _server;
74
75 private boolean _exitJvm = false;
76
77
78
79
80
81
82
83
84
85
86
87 public ShutdownHandler(Server server, String shutdownToken)
88 {
89 this._server = server;
90 this._shutdownToken = shutdownToken;
91 }
92
93 public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
94 {
95 if (!target.equals("/shutdown"))
96 {
97 return;
98 }
99
100 if (!request.getMethod().equals("POST"))
101 {
102 response.sendError(HttpServletResponse.SC_BAD_REQUEST);
103 return;
104 }
105 if (!hasCorrectSecurityToken(request))
106 {
107 LOG.warn("Unauthorized shutdown attempt from " + getRemoteAddr(request));
108 response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
109 return;
110 }
111 if (!requestFromLocalhost(request))
112 {
113 LOG.warn("Unauthorized shutdown attempt from " + getRemoteAddr(request));
114 response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
115 return;
116 }
117
118 LOG.info("Shutting down by request from " + getRemoteAddr(request));
119
120 new Thread()
121 {
122 public void run ()
123 {
124 try
125 {
126 shutdownServer();
127 }
128 catch (InterruptedException e)
129 {
130 LOG.ignore(e);
131 }
132 catch (Exception e)
133 {
134 throw new RuntimeException("Shutting down server",e);
135 }
136 }
137 }.start();
138 }
139
140 private boolean requestFromLocalhost(HttpServletRequest request)
141 {
142 return "127.0.0.1".equals(getRemoteAddr(request));
143 }
144
145 protected String getRemoteAddr(HttpServletRequest request)
146 {
147 return request.getRemoteAddr();
148 }
149
150 private boolean hasCorrectSecurityToken(HttpServletRequest request)
151 {
152 return _shutdownToken.equals(request.getParameter("token"));
153 }
154
155 private void shutdownServer() throws Exception
156 {
157 _server.stop();
158
159 if (_exitJvm)
160 {
161 System.exit(0);
162 }
163 }
164
165 public void setExitJvm(boolean exitJvm)
166 {
167 this._exitJvm = exitJvm;
168 }
169
170 }