FileDocCategorySizeDatePackage
JSPSourceServlet.javaAPI DocExample4290Thu Jun 28 16:14:16 BST 2001None

JSPSourceServlet.java

import java.net.*;
import java.io.*;
import java.text.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.ora.jsp.util.StringFormat;

/**
 * This servlet is intended only for learning about JSP. It returns
 * the JSP file corresponding to the path passed as pathInfo in a form 
 * that shows the unprocessed JSP and HTML elements. If it wasn't for
 * Internet Explorer, all this servlet would have to do would be to
 * set the Content-Type to "text/plain" and send the file. But Internet
 * Explorer believes it knows better than the application developer,
 * so it bluntantly ignores this header and treats any response that
 * contains HTML elements as "text/html", and therefore renders all
 * HTML elements and ignores the JSP pages. To work around this, the
 * servlet sends the response as "text/html", with all special HTML
 * characters converted to the corresponding HTML character entities.
 * <p>
 * Note! Do not install this servlet on a production server. Doing so
 * may be a security risk, since the source of any file can be delivered
 * to the client revealing things like database account names and passwords.
 *
 * @version 1.0
 * @author Hans Bergsten, Gefion software
 */
public class JSPSourceServlet extends HttpServlet {

    /**
     * Handles a GET request by sending the contents of the resource
     * specified by the servlet path to the client.
     *
     * @param req an HttpServletRequest
     * @param res an HttpServletResponse
     * @exception IOException
     */
    public void doGet(HttpServletRequest req, HttpServletResponse res) 
            throws IOException {
        // Get the pathInfo
        String path = req.getPathInfo(); 
        
        // Check for invalid characters in the path
        if (path.indexOf("..") != -1 || path.toUpperCase().indexOf("WEB-INF") != -1) {
            res.sendError(HttpServletResponse.SC_FORBIDDEN,
                "Illegal characters found in path " + path);
            return;
        }

        sendFile(path, res);
    }

    /**
     * Copies the "in" reader to the "out" writer.
     *
     * @param in a BufferedReader
     * @param out a PrintWriter
     */
    private void copyFile(BufferedReader in, PrintWriter out)
            throws IOException {
        int chars;
        char[] buf = new char[4096];
        while ((chars = in.read(buf, 0, buf.length)) != -1) {
            out.write(buf, 0, chars);
            out.flush();
        }
    }
    
    /**
     * Sends the contents of a file to the client.
     *
     * @param pathInfo the file URI
     * @param res an HttpServletResponse
     * @exception IOException
     */
    private void sendFile(String path, HttpServletResponse res) throws IOException {
        String fileName = getServletContext().getRealPath(path);
        if (fileName == null) { 
            res.sendError(HttpServletResponse.SC_NOT_FOUND,
                path + " not found.");
            return;
        }
        
        File file = new File(fileName);
        if (file.isDirectory() || !file.canRead()) {
            res.sendError(HttpServletResponse.SC_FORBIDDEN,
                "No read access to " + file.getAbsolutePath());
            return;
        }

        res.setStatus(HttpServletResponse.SC_OK);
        // Use "text/html" and convert HTML characters to
        // character entities, to fool IE as explained above
        res.setContentType("text/html");
        long lastMod = file.lastModified();
        if (lastMod != 0) {
            res.setDateHeader("Last-modified", lastMod);
        }
        PrintWriter out = res.getWriter();
        // Add HTML header
        out.println("<html><head><title>" + path + "</title></head>");
        out.println("<body><pre>");
        
        // Read the file and convert it
        BufferedReader in = new BufferedReader(new FileReader(file));
        StringWriter rawText = new StringWriter();
        copyFile(in, new PrintWriter(rawText));
        in.close();
        out.write(StringFormat.toHTMLString(rawText.toString()));
        
        // Add HTML footer
        out.println("</pre></body></html>");
        out.close();
    }
}