Thufir
Thufir

Reputation: 8497

load image in filter with getServletContext().getRealPath()

This String in the filter:

   String duke = request.getServletContext().getRealPath("") + "\\" + "duke.gif";

is, or should be, the path to duke.gif. How do I make duke load the image? Assuming that the image is moved into WEB-INF/IMAGES/duke.gif?

Also, is this a sane way to load images in JSP's? I want to dynamically load images in the filter code. For this duke example, it's always the same gif, but I want to be able to change that in the filter.

I'm using Netbeans and Linux, but would like this to be portable.

This JSP:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>login</title>
    </head>
    <body>
        <img src="${requestScope.duke}"> 
        ${requestScope.me}, what's yours?
        <form name="user_name_form" action="controller" method="POST">
            name <input type="text" name="name" value="skinner" size='20' />
            <p>
                <input type="submit">
            </p>
        </form>
        ${requestScope.message}
        <img src="${pageContext.request.contextPath}/WEB-INF/IMAGES/duke.gif" />
        <img src="/WEB-INF/IMAGES/duke.gif" />
        <img src="http://localhost:8080/WebApplication/WEB-INF/IMAGES/duke.gif" />
    </body>
</html>

results in this html:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>login</title>
    </head>
    <body>
        <img src="WEB-INF/IMAGES/duke.gif"> 
        my name is thufir 34562345, what's yours?
        <form name="user_name_form" action="controller" method="POST">
            name <input type="text" name="name" value="skinner" size='20' />
            <p>
                <input type="submit">
            </p>
        </form>

        <img src="/WebApplication/WEB-INF/IMAGES/duke.gif" />
        <img src="/WEB-INF/IMAGES/duke.gif" />
        <img src="http://localhost:8080/WebApplication/WEB-INF/IMAGES/duke.gif" />
    </body>
</html>

the filter:

package net.bounceme.dur.filter;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AuthenticateFilter implements Filter {

    private static final Logger log = Logger.getLogger(AuthenticateFilter.class.getName());
    private FilterConfig filterConfig = null;
    private Map<String, String> mapOfUsers = new HashMap<>();

    public AuthenticateFilter() {
    }

    private void doBeforeProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException {
        log.fine("do before processing..");
    }

    private void doAfterProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException {
        log.fine("do after processing");  //add image here?
    }

    private void makeMap() {
        Enumeration<String> parmNamesEnum = filterConfig.getInitParameterNames();
        List<String> keys = Collections.list(parmNamesEnum);
        for (String s : keys) {
            mapOfUsers.put(s, filterConfig.getInitParameter(s));
        }
        log.fine(mapOfUsers.toString());
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.fine("do filter");
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        String uri = req.getRequestURI();
        log.fine("Requested Resource::" + uri);
        makeMap();  //debatable  and maybe should be in init?  only should run once.
        String name = (String) request.getAttribute("name");
        String message = mapOfUsers.containsValue(name) ? "hello " + name : "no " + name;
        String myName = request.getServletContext().getInitParameter("me");
        String myId = request.getServletContext().getInitParameter("id");
        String me = "my name is " + myName + " " + myId;
        boolean authenticated = mapOfUsers.containsValue(name) ? true : false;
        message = authenticated ? "hello " + name : "";
        //   String duke = request.getServletContext().getRealPath("//duke.gif");
        String duke = request.getServletContext().getRealPath("") + "\\" + "duke.gif";
        duke = "WEB-INF/IMAGES/duke.gif";
        log.info("filter user is\t\t\t" + message);
        log.info("filter authenticated is\t\t" + authenticated);
        log.info("filter message is\t\t" + message);
        log.info("filter duke is\t\t\t" + duke);
        request.setAttribute("me", me);
        request.setAttribute("authenticated", authenticated);
        request.setAttribute("message", message);
        request.setAttribute("duke", duke);
        chain.doFilter(request, response);
    }

    public FilterConfig getFilterConfig() {
        return (this.filterConfig);
    }

    public void setFilterConfig(FilterConfig filterConfig) {
        this.filterConfig = filterConfig;
    }

    @Override
    public void destroy() {
    }

    @Override
    public void init(FilterConfig filterConfig) {
        log.fine("init");

        this.filterConfig = filterConfig;
        if (filterConfig != null) {
            log.fine("SessionCheckFilter:Initializing filter");
        } else {
            log.warning("null filterConfig");
        }
    }

    @Override
    public String toString() {
        if (filterConfig == null) {
            return ("SessionCheckFilter()");
        }
        StringBuilder sb = new StringBuilder("SessionCheckFilter(");
        sb.append(filterConfig);
        sb.append(")");
        return (sb.toString());
    }

    private void sendProcessingError(Throwable t, ServletResponse response) {
        log.fine("send processing error");
        String stackTrace = getStackTrace(t);

        if (stackTrace != null && !stackTrace.equals("")) {
            try {
                response.setContentType("text/html");
                try (PrintStream ps = new PrintStream(response.getOutputStream()); PrintWriter pw = new PrintWriter(ps)) {
                    pw.print("<html>\n<head>\n<title>Error</title>\n</head>\n<body>\n"); //NOI18N
                    pw.print("<h1>The resource did not process correctly</h1>\n<pre>\n");
                    pw.print(stackTrace);
                    pw.print("</pre></body>\n</html>"); //NOI18N
                }
                response.getOutputStream().close();
            } catch (Exception ex) {
            }
        } else {
            try {
                try (PrintStream ps = new PrintStream(response.getOutputStream())) {
                    t.printStackTrace(ps);
                }
                response.getOutputStream().close();
            } catch (Exception ex) {
            }
        }
    }

    public static String getStackTrace(Throwable t) {
        String stackTrace = null;
        try {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            t.printStackTrace(pw);
            pw.close();
            sw.close();
            stackTrace = sw.getBuffer().toString();
        } catch (Exception ex) {
        }
        log.warning(stackTrace);
        return stackTrace;
    }

}

see also:

https://askubuntu.com/questions/583309/when-a-war-is-deployed-in-glassfish-whats-the-path-to-web-inf

Upvotes: 0

Views: 1464

Answers (2)

Thufir
Thufir

Reputation: 8497

This kludge works.

war file:

thufir@doge:~$ 
thufir@doge:~$ jar -tf NetBeansProjects/WebApplication/dist/WebApplication.war 
META-INF/
META-INF/MANIFEST.MF
WEB-INF/
WEB-INF/classes/
WEB-INF/classes/beginnersbook/
WEB-INF/classes/beginnersbook/com/
WEB-INF/classes/net/
WEB-INF/classes/net/bounceme/
WEB-INF/classes/net/bounceme/dur/
WEB-INF/classes/net/bounceme/dur/filter/
WEB-INF/classes/net/bounceme/dur/servlets/
WEB-INF/images/
WEB-INF/resources/
WEB-INF/classes/beginnersbook/com/Details.class
WEB-INF/classes/net/bounceme/dur/filter/AuthenticateFilter.class
WEB-INF/classes/net/bounceme/dur/filter/SessionCheckFilter.class
WEB-INF/classes/net/bounceme/dur/servlets/Controller.class
WEB-INF/classes/net/bounceme/dur/servlets/MyToken.class
WEB-INF/classes/properties.properties
WEB-INF/duke.gif
WEB-INF/fail.jsp
WEB-INF/images/duke.gif
WEB-INF/login.jsp
WEB-INF/resources/duke.gif
WEB-INF/success.jsp
WEB-INF/web.xml
duke.gif
index.html
thufir@doge:~$ 

html (duke image loads):

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>login</title>
    </head>
    <body>
        <img src="http://localhost:8080/WebApplication/duke.gif"> 
        my name is thufir 34562345, what's yours?
        <form name="user_name_form" action="controller" method="POST">
            name <input type="text" name="name" value="skinner" size='20' />
            <p>
                <input type="submit">
            </p>
        </form>

    </body>
</html>

the login.jsp code:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>login</title>
    </head>
    <body>
        <img src="${requestScope.duke}"> 
        ${requestScope.me}, what's yours?
        <form name="user_name_form" action="controller" method="POST">
            name <input type="text" name="name" value="skinner" size='20' />
            <p>
                <input type="submit">
            </p>
        </form>
        ${requestScope.message}
    </body>
</html>

and the filter:

package net.bounceme.dur.filter;

import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AuthenticateFilter implements Filter {

    private static final Logger log = Logger.getLogger(AuthenticateFilter.class.getName());
    private FilterConfig filterConfig = null;
    private Map<String, String> mapOfUsers = new HashMap<>();

    public AuthenticateFilter() {
    }

    private void doBeforeProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException {
        log.fine("do before processing..");
    }

    private void doAfterProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException {
        log.fine("do after processing");  //add image here?
    }

    private void makeMap() {
        Enumeration<String> parmNamesEnum = filterConfig.getInitParameterNames();
        List<String> keys = Collections.list(parmNamesEnum);
        for (String s : keys) {
            mapOfUsers.put(s, filterConfig.getInitParameter(s));
        }
        log.fine(mapOfUsers.toString());
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.fine("do filter");
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        String uri = req.getRequestURI();
        log.fine("Requested Resource::" + uri);
        makeMap();  //debatable  and maybe should be in init?  only should run once.
        String name = (String) request.getAttribute("name");
        String message = mapOfUsers.containsValue(name) ? "hello " + name : "no " + name;
        String myName = request.getServletContext().getInitParameter("me");
        String myId = request.getServletContext().getInitParameter("id");
        String me = "my name is " + myName + " " + myId;
        boolean authenticated = mapOfUsers.containsValue(name) ? true : false;
        message = authenticated ? "hello " + name : "";
        String hp = request.getServerName();
        int p = request.getServerPort();
        String duke = "http://" + hp + ":" + p + request.getServletContext().getContextPath() + "/duke.gif";
        log.info("filter user is\t\t\t" + message);
        log.info("filter authenticated is\t\t" + authenticated);
        log.info("filter message is\t\t" + message);
        log.info("filter duke is\t\t\t" + duke);
        request.setAttribute("me", me);
        request.setAttribute("authenticated", authenticated);
        request.setAttribute("message", message);
        request.setAttribute("duke", duke);
        chain.doFilter(request, response);
    }

    public FilterConfig getFilterConfig() {
        return (this.filterConfig);
    }

    public void setFilterConfig(FilterConfig filterConfig) {
        this.filterConfig = filterConfig;
    }

    @Override
    public void destroy() {
    }

    @Override
    public void init(FilterConfig filterConfig) {
        log.fine("init");

        this.filterConfig = filterConfig;
        if (filterConfig != null) {
            log.fine("SessionCheckFilter:Initializing filter");
        } else {
            log.warning("null filterConfig");
        }
    }

    @Override
    public String toString() {
        if (filterConfig == null) {
            return ("SessionCheckFilter()");
        }
        StringBuilder sb = new StringBuilder("SessionCheckFilter(");
        sb.append(filterConfig);
        sb.append(")");
        return (sb.toString());
    }

    private void sendProcessingError(Throwable t, ServletResponse response) {
        log.fine("send processing error");
        String stackTrace = getStackTrace(t);

        if (stackTrace != null && !stackTrace.equals("")) {
            try {
                response.setContentType("text/html");
                try (PrintStream ps = new PrintStream(response.getOutputStream()); PrintWriter pw = new PrintWriter(ps)) {
                    pw.print("<html>\n<head>\n<title>Error</title>\n</head>\n<body>\n"); //NOI18N
                    pw.print("<h1>The resource did not process correctly</h1>\n<pre>\n");
                    pw.print(stackTrace);
                    pw.print("</pre></body>\n</html>"); //NOI18N
                }
                response.getOutputStream().close();
            } catch (Exception ex) {
            }
        } else {
            try {
                try (PrintStream ps = new PrintStream(response.getOutputStream())) {
                    t.printStackTrace(ps);
                }
                response.getOutputStream().close();
            } catch (Exception ex) {
            }
        }
    }

    public static String getStackTrace(Throwable t) {
        String stackTrace = null;
        try {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            t.printStackTrace(pw);
            pw.close();
            sw.close();
            stackTrace = sw.getBuffer().toString();
        } catch (Exception ex) {
        }
        log.warning(stackTrace);
        return stackTrace;
    }

}

I'm sure there's a better way.

Upvotes: 0

Damian Nikodem
Damian Nikodem

Reputation: 1289

It appears that you are returning the location "on disk" to your image instead of the url, this is sort-of dependent on how your servlet is configured in your application server but I am guessing simply calling "images/duke.gif" would be more than enough to cause your image to load.

Upvotes: 1

Related Questions