1

web.xml ファイルでカスタム エラー ページを構成しましたが、ページで参照されている画像が壊れたリンクとして表示されます。

カスタム エラー ページは単純な 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 エラーをスローするために使用され、ページが表示されます。しかし、参照された画像が見つかりません。ファイルを Web ブラウザーにドラッグするだけで正しく表示されるので、これは文脈の問題だと思いました。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");
    } 
}
4

2 に答える 2

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アプリケーションの接続パスです)

于 2013-01-05T15:38:07.540 に答える
1

へのリクエストに対してフィルタをアクティブにしないでください/error/*。あなたが提供した情報から私が理解している限り、ブラウザは にリクエストを送信します/error/NoAccessImage.png。これはフィルタを通過し、サーバーは画像ではなく 401 で応答します。

選択したブラウザー (多くの場合、F12 を使用してアクティブ化) で開発コンソールを使用して、要求/応答とそれぞれの HTTP ステータス コードを確認します。

また、それ以外のコンテキスト ルートを使用してアプリケーションがデプロイされている場合にも関連/server:port/foo/index.servletますserver:port/index.servlet。前者の場合、画像へのパスは/foo/error/NoAccessImage.png.

于 2013-01-05T15:36:55.937 に答える