0

わかりました-私は最近Javaフィルターを使っていくつかの作業を行っていますが、Webアプリ間を移動するときにコードをリサイクルしなければならないことがよくあります。フィルタに相対的な場所を表示させて、複数のコンテキストで使用できるようにすることもできますが、それでも多くのフィルタを通過します。そこで、コード作成を支援するスーパークラスを作成しました。また、runFilterメソッドをスーパークラスの抽象メソッドとして追加し、標準のdoFilterから分離しました。スーパークラスのコードは次のようになります。

public void doFilter(ServletRequest req, ServletResponse resp,
        FilterChain chain) throws IOException, ServletException {
    try {
        runFilter(req,resp,chain);
    }
    catch (Exception e) {
        getLogger().error("Error! Exception:",e);
    }
}

さて、ここに問題があります:上記のコードを拡張するフィルターがトリガーされるたびに、上記のロガーで設定したようなエラーが発生しますが、子クラスのrunFilter内から、そのジョブを実行していることを示すロガーメッセージも取得します-転送さえ本来の動作をします。コンソールを見ると、子クラスがフィルターチェーンにアクセスしている行でエラーが発生していることがわかります。

if (isExcluded(debugURI)) {
        chain.doFilter(request, response);
        return;
    } else if (request.getSession().getAttribute("USER") == null) {
        getLogger().info("Session with ID " + serialVersionUID + " has timed out. Redirecting to " + getRedirectTarget() + ".");
        response.sendRedirect(getRedirectTarget()); 
        chain.doFilter(request, response);
        return;
    }
    else {
        chain.doFilter(request, response);
        return;
    }

runFilterの呼び出しも受信するために、FilterChainを更新(または拡張)する必要がありますか?どんな助けでも非常に役に立ちます。

4

1 に答える 1

0

サーブレットを使った作業の非常に早い段階で、このエラーに遭遇しました。実際、問題は非常に単純です。各フィルターのインスタンス化が基本的なレベルで失敗したため、スーパークラス内からエラーが生成されました。ただし、本当の失敗は、sendRedirectの後にdoFilterメソッドを呼び出そうとしたことでした。sendRedirectメソッドはチェーンを終了するため、スタブにアクセスしようとしていました。sendRedirectはフィルターチェーンを終了するため、リダイレクトはフィルターチェーン内で処理する必要があります。

于 2015-10-05T20:43:31.860 に答える