【问题标题】:load image in filter with getServletContext().getRealPath()使用 getServletContext().getRealPath() 在过滤器中加载图像
【发布时间】:2015-04-08 18:26:21
【问题描述】:

过滤器中的这个String

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

是或应该是duke.gif 的路径。如何让duke 加载图像?假设图片移动到WEB-INF/IMAGES/duke.gif

另外,这是在 JSP 中加载图像的合理方法吗?我想在过滤器代码中动态加载图像。对于这个 duke 示例,它始终是相同的 gif,但我希望能够在过滤器中更改它。

我正在使用 Netbeans 和 Linux,但希望它是可移植的。

这个 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>

在这个 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>

过滤器:

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;
    }

}

另见:

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

【问题讨论】:

标签: html image jsp jakarta-ee servlet-filters


【解决方案1】:

您似乎将“磁盘上”的位置返回到您的图像而不是 url,这在某种程度上取决于您的 servlet 在应用程序服务器中的配置方式,但我猜只是调用“images/duke. gif" 足以让您的图片加载。

【讨论】:

  • 我更新了问题。我想要路径(?),如果它一个路径,作为它的部署文件。如果这甚至可以作为一种加载图像的方式。
  • 我假设你想从部署的servlet的位置获取图片的相对url?
  • 我想是的。部署 WAR 后,Glassfish 将解压 WAR。一旦GF解压缩所有内容,我想我想要文件的路径。 (?)
  • 很少需要“完整”网址,但我可以在 15 分钟前的编辑中看到您正在硬编码 web-inf/IMAGES/duke.gif。从您的 ask-ubuntu 帖子中查看路径列表,我不得不说该位置很简单:“images/duke.gif”(不要担心 web-inf 部分)。该 url 将相对于 netbeans 和 glassfish 中的 JSP 位置。
  • 我正在尝试几种不同的方法。我认为这是一个 GF 配置,也许。更新的问题。它不必是“完整”的 URL;在这一点上,任何可行的方法。
【解决方案2】:

这个组合很有效。

战争文件:

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(公爵图片加载):

<!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>

login.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}
    </body>
</html>

和过滤器:

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;
    }

}

我相信有更好的方法。

【讨论】:

    猜你喜欢
    • 2014-11-21
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    相关资源
    最近更新 更多