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