这个问题的标题很难,因为我们甚至无法诊断问题的确切来源。请允许我首先构建应用程序的结构,然后跟进我们遇到的问题。
设置
我们有一个使用Spring Security的大型多模块Spring 4.x应用程序。 Spring安全性提倡使用过滤器来检查请求上的属性,以确定它是否应该被请求处理程序拒绝或处理。我们使用这些,我们的身份验证适用于单个请求。但是,我们的身份验证基于我们内部服务的许多数据模型。要在过滤器中访问这些数据模型,我们注入"服务bean" (引用因为它们实际上是WITH CUSTOMERSWITHLESSTHANFOURORDERS
AS
(
SELECT CUSTOMERNUMBER
FROM CLASSICMODELS.ORDERS
GROUP BY CUSTOMERNUMBER
HAVING COUNT(CUSTOMERNUMBER) < 4
)
SELECT O.CUSTOMERNUMBER,
C.CUSTOMERNAME,
E.LASTNAME,
E.FIRSTNAME,
E.EMPLOYEENUMBER
FROM CUSTOMERSWITHLESSTHANFOURORDERS O
JOIN CLASSICMODELS.CUSTOMERS C
ON O.CUSTOMERNUMBER = C.CUSTOMERNUMBER
JOIN CLASSICMODELS.EMPLOYEES E
ON E.EMPLOYEENUMBER = C.SALESREPEMPLOYEENUMBER;
但是包含我们的服务层)到过滤器中。我们的一个过滤器@Components
根据请求参数检索了几个这样的模型,然后在继续链之前将这些模型放在请求的属性中。
链中的后续过滤器从请求的属性中检索这些模型,并使用它们来确定用户是否已获得授权。
所有&#34;服务bean&#34;以这种方式注入的标记有以下注释:
EarlyLoadingFilter
问题
在使用请求使服务器饱和时,我们遇到了一些线程安全问题。在正常使用期间,它完全按照我们的预期执行。然而,在负载下,当在短时间内处理大量请求时,我们发现给定请求可以基于先前请求的数据接收响应。也就是说,似乎请求之间保留了请求属性。
现在,我意识到servlet过滤器是单例,但我们在任何过滤器中依赖的唯一实例变量是服务的自动装配bean。
我们是否可能会忽略Spring或Spring Security的一些关键配置?有没有办法利用Spring的HandlerInterceptors来实现与我们的身份验证相同的结果,而无需在servlet过滤器中捣乱?我们认为这是线程或过滤器相关的吗?
提前感谢您提供的任何帮助,这个问题已经变得令人生气!