1

我使用过滤器接口实现了一个 Http 过滤器,它在 localhost 中运行良好。问题是,在测试环境中,当两个用户想要访问应用程序时,此过滤器不会像往常一样工作。它混合了两个用户之间的数据。我知道这一点,因为我有很多日志每时每刻都在报告我的步骤。不知道同时访问有没有问题。

4

1 回答 1

0

像 servlet 一样,过滤器是应用程序范围的。在应用程序启动期间只创建了一个过滤器类的实例,并且在应用程序的整个生命周期中,所有 HTTP 请求都重用了同一个实例。您的问题症状表明您出于某种原因将请求或会话范围的变量分配为过滤器实例的实例变量,例如请求参数或会话属性,甚至可能是整个请求或会话对象本身。

例如,

public class MyFilter implements Filter {

    private String someParam;

    public void doFilter(... ...) {
        someParam = request.getParameter("someParam");
        // ...
    }

}

不是线程安全的!您应该在方法本地范围内声明它们:

public class MyFilter implements Filter {

    public void doFilter(... ...) {
        String someParam = request.getParameter("someParam");
        // ...
    }

}

也可以看看:

于 2013-11-15T10:57:30.900 回答