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

FilterChain 是否也需要更新(或扩展)才能接收 runFilter 的调用?任何帮助都会非常有用。

4

1 回答 1

0

我很早就在使用 servlet 时偶然发现了这个错误。这个问题其实很简单。我在超类中产生了错误,因为每个过滤器实例化在基本层面上都失败了;然而,真正的错误是我尝试在 sendRedirect 之后调用 doFilter 方法 - 因为 sendRedirect 方法终止了链,所以我试图访问一个存根。任何重定向都需要在过滤器链中处理,因为 sendRedirect 会终止它。

于 2015-10-05T20:43:31.860 回答