1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package com.acme;
20
21 import java.io.IOException;
22 import java.io.OutputStream;
23 import java.io.PrintWriter;
24 import javax.servlet.RequestDispatcher;
25 import javax.servlet.ServletContext;
26 import javax.servlet.ServletException;
27 import javax.servlet.ServletOutputStream;
28 import javax.servlet.http.HttpServlet;
29 import javax.servlet.http.HttpServletRequest;
30 import javax.servlet.http.HttpServletRequestWrapper;
31 import javax.servlet.http.HttpServletResponse;
32 import javax.servlet.http.HttpServletResponseWrapper;
33
34 import org.eclipse.jetty.util.log.Log;
35 import org.eclipse.jetty.util.log.Logger;
36
37
38
39
40
41
42
43 @SuppressWarnings("serial")
44 public class DispatchServlet extends HttpServlet
45 {
46 private static final Logger LOG = Log.getLogger(DispatchServlet.class);
47
48
49 String pageType;
50
51
52 @Override
53 public void doPost(HttpServletRequest sreq, HttpServletResponse sres) throws ServletException, IOException
54 {
55 doGet(sreq, sres);
56 }
57
58
59 @Override
60 public void doGet(HttpServletRequest sreq, HttpServletResponse sres) throws ServletException, IOException
61 {
62 if (sreq.getParameter("wrap") != null)
63 {
64 sreq= new HttpServletRequestWrapper(sreq);
65 sres= new HttpServletResponseWrapper(sres);
66 }
67
68 if (sreq.getParameter("session") != null)
69 sreq.getSession(true);
70
71 String prefix=
72 sreq.getContextPath() != null ? sreq.getContextPath() + sreq.getServletPath() : sreq.getServletPath();
73
74 String info;
75
76 if (sreq.getAttribute("javax.servlet.include.servlet_path") != null)
77 info= (String)sreq.getAttribute("javax.servlet.include.path_info");
78 else
79 info= sreq.getPathInfo();
80
81 if (info == null)
82 info= "NULL";
83
84 if (info.indexOf(sreq.getServletPath()) > 0)
85 {
86 sres.sendError(403,"Nested " + sreq.getServletPath() + " forbidden.");
87 return;
88 }
89
90 if(info.indexOf(getServletName()) > 0)
91 {
92 sres.sendError(403,"Nested " + getServletName() + " forbidden.");
93 return;
94 }
95
96 if (info.startsWith("/includeW/"))
97 {
98 sres.setContentType("text/html");
99 info= info.substring(9);
100 if (info.indexOf('?') < 0)
101 info += "?Dispatch=include";
102 else
103 info += "&Dispatch=include";
104
105 PrintWriter pout= null;
106 pout= sres.getWriter();
107 pout.write("<H1>Include (writer): " + info + "</H1><HR>");
108
109 RequestDispatcher dispatch= getServletContext().getRequestDispatcher(info);
110 if (dispatch == null)
111 {
112 pout= sres.getWriter();
113 pout.write("<H1>Null dispatcher</H1>");
114 }
115 else
116 dispatch.include(sreq, sres);
117
118 pout.write("<HR><H1>-- Included (writer)</H1>");
119 }
120 else if (info.startsWith("/includeS/"))
121 {
122 sres.setContentType("text/html");
123 info= info.substring(9);
124 if (info.indexOf('?') < 0)
125 info += "?Dispatch=include";
126 else
127 info += "&Dispatch=include";
128
129 OutputStream out= null;
130 out= sres.getOutputStream();
131 out.write(("<H1>Include (outputstream): " + info + "</H1><HR>").getBytes());
132
133 RequestDispatcher dispatch= getServletContext().getRequestDispatcher(info);
134 if (dispatch == null)
135 {
136 out= sres.getOutputStream();
137 out.write("<H1>Null dispatcher</H1>".getBytes());
138 }
139 else
140 dispatch.include(sreq, sres);
141
142 out.write("<HR><H1>-- Included (outputstream)</H1>".getBytes());
143
144 }
145 else if (info.startsWith("/forward/"))
146 {
147 info= info.substring(8);
148 if (info.indexOf('?') < 0)
149 info += "?Dispatch=forward";
150 else
151 info += "&Dispatch=forward";
152
153 RequestDispatcher dispatch= getServletContext().getRequestDispatcher(info);
154 if (dispatch != null)
155 {
156 ServletOutputStream out =sres.getOutputStream();
157 out.print("Can't see this");
158 dispatch.forward(sreq, sres);
159 try
160 {
161
162 out.println("IOException");
163
164 throw new IllegalStateException();
165 }
166 catch(IOException e)
167 {
168 LOG.ignore(e);
169 }
170 }
171 else
172 {
173 sres.setContentType("text/html");
174 PrintWriter pout= sres.getWriter();
175 pout.write("<H1>No dispatcher for: " + info + "</H1><HR>");
176 pout.flush();
177 }
178 }
179 else if (info.startsWith("/forwardC/"))
180 {
181 info= info.substring(9);
182 if (info.indexOf('?') < 0)
183 info += "?Dispatch=forward";
184 else
185 info += "&Dispatch=forward";
186
187 String cpath= info.substring(0, info.indexOf('/', 1));
188 info= info.substring(cpath.length());
189
190 ServletContext context= getServletContext().getContext(cpath);
191 RequestDispatcher dispatch= context.getRequestDispatcher(info);
192
193 if (dispatch != null)
194 {
195 dispatch.forward(sreq, sres);
196 }
197 else
198 {
199 sres.setContentType("text/html");
200 PrintWriter pout= sres.getWriter();
201 pout.write("<H1>No dispatcher for: " + cpath + "/" + info + "</H1><HR>");
202 pout.flush();
203 }
204 }
205 else if (info.startsWith("/includeN/"))
206 {
207 sres.setContentType("text/html");
208 info= info.substring(10);
209 if (info.indexOf("/") >= 0)
210 info= info.substring(0, info.indexOf("/"));
211
212 PrintWriter pout;
213 if (info.startsWith("/null"))
214 info= info.substring(5);
215 else
216 {
217 pout= sres.getWriter();
218 pout.write("<H1>Include named: " + info + "</H1><HR>");
219 }
220
221 RequestDispatcher dispatch= getServletContext().getNamedDispatcher(info);
222 if (dispatch != null)
223 dispatch.include(sreq, sres);
224 else
225 {
226 pout= sres.getWriter();
227 pout.write("<H1>No servlet named: " + info + "</H1>");
228 }
229
230 pout= sres.getWriter();
231 pout.write("<HR><H1>Included ");
232 }
233 else if (info.startsWith("/forwardN/"))
234 {
235 info= info.substring(10);
236 if (info.indexOf("/") >= 0)
237 info= info.substring(0, info.indexOf("/"));
238 RequestDispatcher dispatch= getServletContext().getNamedDispatcher(info);
239 if (dispatch != null)
240 dispatch.forward(sreq, sres);
241 else
242 {
243 sres.setContentType("text/html");
244 PrintWriter pout= sres.getWriter();
245 pout.write("<H1>No servlet named: " + info + "</H1>");
246 pout.flush();
247 }
248 }
249 else
250 {
251 sres.setContentType("text/html");
252 PrintWriter pout= sres.getWriter();
253 pout.write(
254 "<H1>Dispatch URL must be of the form: </H1>"
255 + "<PRE>"
256 + prefix
257 + "/includeW/path\n"
258 + prefix
259 + "/includeS/path\n"
260 + prefix
261 + "/forward/path\n"
262 + prefix
263 + "/includeN/name\n"
264 + prefix
265 + "/forwardC/_context/path\n</PRE>");
266 }
267
268 }
269
270
271 @Override
272 public String getServletInfo()
273 {
274 return "Include Servlet";
275 }
276
277
278 @Override
279 public synchronized void destroy()
280 {
281 }
282
283 }