为什么不能从JSP文件加载图像和样式表?

时间:2015-05-13 11:27:36

标签: java jsp

过去我们使用SSO解决方案进行身份验证。 servlet过滤器正在检查登录等。 为了降低成本,我们希望用对我们数据库的简单认证来替换它。

这里的计划是使用旧的登录/密码更改jsp(位于sso服务器上)并以这种方式直接在我们的应用程序中调用它(如果过滤器检测到未登录的用户):

req.getRequestDispatcher("/auth/login.jsp").include(req, response);

显示页面,但仅显示文本。图像和样式表未显示。 (无法找到)。

<img src="/auth/platform.jpg" alt="platform" class="left" />

我尝试了其他几种方法,但所有这些版本都没有用。我知道,相对路径不起作用!

<img src="auth/platform.jpg" />
<img src=".auth/platform.jpg" />
<img src="<%=request.getContextPath()%>/auth/platform.jpg" />

我输出以下内容,一切都是空的。

ServletPath: <%request.getServletPath(); %> <br />
ServletContext: <%request.getServletContext();%> <br />
ContextPath: <%request.getContextPath(); %> <br />
LocalAddr: <%request.getLocalAddr(); %> <br />
PathInfo: <%request.getPathInfo(); %> <br />
RemoteAddr: <%request.getRemoteAddr(); %> <br />
RemoteHost: <%request.getRemoteHost(); %> <br />

在原始项目(登录页面所在的项目)中,jsp看起来只有:

<img src="images/platform.jpg" />

它有效,也有相对引用...

通过以这种方式引用样式表(或上述任何其他方式)也找不到样式表:

<link href="/auth/style.css" rel="stylesheet" type="text/css" />

但如果我使用这种方式,它会起作用!

<style>
    <%@ include file="/auth/style.css"%>
</style> 

这是我的结构:

enter image description here

我的web.xml中还需要其他内容吗?

我知道,如今将使用JSF,但这是一个旧项目,应该尽可能少地进行修改。

这是http错误消息:

ERROR] 500 - GET /auth/platform.jpg (127.0.0.1) 2720 bytes
   Request headers
      Host: localhost:8888
      User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0
      Accept: image/png,image/*;q=0.8,*/*;q=0.5
      Accept-Language: en-gb,en;q=0.5
      Accept-Encoding: gzip, deflate
      Referer: http://localhost:8888/Application.html?gwt.codesvr=127.0.0.1:9997&groupId=xxx
      Cookie: JSESSIONID=b56c92nn81g51d28ys2l65dg2
      Connection: keep-alive
   Response headers
      Accept-Ranges: bytes
      Content-Type: text/html
      Content-Length: 2720
      Last-Modified: Thu, 30 Apr 2015 11:43:38 GMT

3 个答案:

答案 0 :(得分:0)

JSP中图像和CSS的路径应该相对于servlet的URL而不是JSP文件本身。

答案 1 :(得分:0)

您可以将HTML标记设置为应用程序的上下文根(例如http://locahost:8080/myapp),文档中的所有相对网址都将相对于此进行解析:

http://www.w3schools.com/tags/tag_base.asp

因此,在JSP中,您可以执行以下操作

    

<%
    String path = request.getContextPath();
    String basePath = request.getScheme()
        + "://"
        + request.getServerName()
        + ":"
        + (request.getServerPort() != 80
            ? request.getServerPort()
            : "") + path + "/";
%>

    <head>
        <base href="<%=basePath%>" />

        <!-- relative link to a folder 'css' in the webapp root -->
        <link href="css/my-css.css" rel="stylesheet" media="screen" />

    </head>
</html>

您可以通过使用或调整此方法来避免使用scriptlet

how to get the base url from jsp request object?

如果您没有使用模板库,那么您可以创建一个标记文件,以避免在所有页面中重复此操作。

答案 2 :(得分:0)

搜索了几个小时后,我找到了“不显示图片和加载样式表”的原因。

使用以下HTML代码,我得到了一个HTTP 200(直接...)

<img src="images/xxx.jpg" />

未显示图像的原因是验证(servlet)过滤器,它检查现有会话(用户登录等)。由于这是一个登录页面,因此没有有效的会话,所有其他请求(加载样式表和图像)都被阻止。

我的过滤器看起来像:

Guice.createInjector(..., new ServletModule() {

   @Override
   protected void configureServlets() {
      filter("/*").through(MyFilter.class);
   }
}

允许图像(jpgs)的最简单方法是将以下内容添加到我的doFilter()中:

if (httpServletRequest.getRequestURI().endsWith(".jpg")) {
    chain.doFilter(request, response);
}

问题是要找出,那就是导致问题的过滤器......

谢谢你们。