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