2013-01-05 48 views
1

我在我的web.xml文件中配置了自定義錯誤頁面,但頁面中引用的圖像顯示爲斷開的鏈接。自定義Tomcat錯誤頁面不顯示圖像

自定義錯誤頁僅僅是一個簡單的HTML頁面:

<!DOCTYPE html> 
<html><head> 
    <meta charset="UTF-8"><title>401 Error</title></head> 
<body> 
    <p style="font-size: 200%; text-align: center">HTTP Error 401: Not authorized to view sensitive data.<br/> 
    <img src="NoAccessImage.png" alt="401Error"><br/> 
    You must log in before viewing the requested page.</p> 
</body></html> 

本頁面被存儲在一個文件夾中的錯誤,隨着圖像文件,它引用。 身份驗證過濾器用於引發401錯誤,並且如果我在未首先登錄的情況下嘗試查看受保護的內容,該頁面就會顯示。但引用的圖像缺失。如果我只是將文件拖入網頁瀏覽器,它顯示正確,所以我認爲這是一個上下文的問題。我嘗試將img src標記更改爲"/error/NoAccessImage.png",但沒有任何結果。

相關AuthenticationFilter代碼如下:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {  
    try { 
     boolean authorized = false; 
     HttpServletRequest r = (HttpServletRequest) request; 
     HttpSession session = ((HttpServletRequest)request).getSession(false); 
     String uri = r.getRequestURI(); 
     if(uri.indexOf("/Login")>0) { 
      chain.doFilter(request, response); 
      return;    
     } 
     if (session != null) { 
      String school = (String) session.getAttribute("school"); 
      if(school != null && school.length()>0) { 
       authorized = (school.equals(getURISchool(uri))); 
      } 
     } 
     if (authorized) { 
      chain.doFilter(request, response); 
      return; 
     } else { 
      ((HttpServletResponse) response).sendError(401, "You must log in to view the schedule."); 
     } 
    } catch (IOException io) { 
     System.out.println("IOException raised in AuthenticationFilter"); 
    } 
} 
+1

從內部做一個左點擊圖片上的瀏覽器並複製鏈接到圖像。並檢查:) – 2013-01-05 15:29:29

回答

2

服務器不會重定向到您的錯誤頁面。它向前發展。因此,如果初始調用的URL爲http://localhost/myApp/foo/bar/baz/SomeAction,由於您爲圖像使用了相對路徑,瀏覽器將在http://localhost/myApp/foo/bar/baz/NoAccessImage.png中查找圖像。因此,您應該使用絕對路徑來引用圖像(以及所有圖像,資源和鏈接)。

而且由於每個應用程序都有一個上下文路徑,所以您必須預先加載URL的上下文路徑。這就是JSTL <c:url>標籤做什麼:

<img src="<c:url value='/error/NoAccessImage.png'/>" alt="401Error"/> 

將被翻譯成

<img src="/myApp/error/NoAccessImage.png" alt="401Error"/> 

myApp爲您的應用程序的contect路徑)

+0

謝謝!我想我需要一個絕對路徑,但由於這個應用程序通過https部署到多個服務器,編碼絕對路徑並不實際。我沒有想到看JSTL。 – Thorn

1

過濾器必須不要求/error/*活躍。據我所知,從您提供的信息中,瀏覽器向/error/NoAccessImage.png發送了一個請求,它通過過濾器並且服務器響應401而不是圖像。

在您選擇的瀏覽器中使用開發控制檯(通常使用F12激活)來查看請求/響應及其各自的HTTP狀態代碼。

此外,如果您的應用程序是使用除/以外的上下文根進行部署的,也就是server:port/foo/index.servletserver:port/index.servlet。如果是前者,圖片的路徑必須是/foo/error/NoAccessImage.png

+0

好建議。但是這只是證實了我的懷疑:瀏覽器正在錯誤位置查找文件。 – Thorn

+0

「錯誤的位置」意味着它缺少上下文路徑(我最後一段中的信息)? –

相關問題