Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为Spring控制器/服务类中的每个请求访问过滤器中计算的数据_Spring_Spring Mvc - Fatal编程技术网

为Spring控制器/服务类中的每个请求访问过滤器中计算的数据

为Spring控制器/服务类中的每个请求访问过滤器中计算的数据,spring,spring-mvc,Spring,Spring Mvc,在我们的应用程序中,所有rest API的形式如下: http://{context}/{product\u id}/{rest\u url\u path} 我必须通过从数据库中获取产品id的ProductDetails来验证Spring安全过滤器/SpringMVC拦截器中的{product\u id}。将在Spring控制器/服务类中使用ProductDetails 我不想在控制器/服务中再次获取ProductDetails。因此,我想将ProductDetails对象存储在该Request

在我们的应用程序中,所有rest API的形式如下:

http://{context}/{product\u id}/{rest\u url\u path}

我必须通过从数据库中获取产品id的
ProductDetails
来验证Spring安全过滤器/SpringMVC拦截器中的{product\u id}。将在Spring控制器/服务类中使用
ProductDetails

我不想在控制器/服务中再次获取
ProductDetails
。因此,我想将
ProductDetails
对象存储在该
RequestScope
的某个位置

我有三种想法。但每种方法都有其优缺点。请让我知道哪一个更好的3。还建议任何替代方法

方法1:

ProductDetails
对象保存在请求属性中。 在控制器内部,我可以轻松获得
HttpRequest
。内部服务,我可以通过以下方式获得
HttpRequest

@Autowired
HttpServletRequest request;

但我不希望在服务中具有HTTP请求依赖性,从而使代码更加独立于WebLayer逻辑

方法2:

基于
产品id
使用任何内存缓存来存储
产品详细信息

但我认为这只是对这个用例的过度杀戮。增加缓存的不必要依赖项

方法3:

将对象存储在
ThreadLocal
变量中,以存储请求范围数据。 但不确定这样是否正确


让我知道一种有效的方法来解决这个问题

您提到的第一种方法是更有效的方法来访问筛选器和控制器中的相同数据,即使您必须在SpringController中注入HttpservletRequest的依赖项


如果数据是特定于用户的,就像其他用户无法访问这些数据一样,那么您应该使用ThreadLocal。

您提到的第一种方法是更有效地访问筛选器和控制器中的相同数据,即使您必须在SpringController中注入HttpservletRequest的依赖项


如果数据非常特定于用户,就像其他用户无法访问这些数据一样,那么您应该使用ThreadLocal。

1st和3rd适用于您的问题解决方案,但第一个更优雅,因为数据仅存储在当前请求范围内,并且在服务器发送响应时会自动丢失。您也可以使用threadLocal,但必须小心,如果忘记删除对象,它将挂在使用线程池的环境中

1st和3rd适用于您的问题状态,但第一个更为优雅,因为数据仅存储在当前请求范围内,并且在服务器发送响应时会自动丢失。您也可以使用threadLocal,但必须小心,如果忘记删除对象,它将挂在使用线程池的环境中

有关更多信息,请查看。这是一种类似的用例。根据上面的线程,我猜使用
ThreadLocal
似乎很有效。它还说明了如何使用
requestscopebean
。这似乎更有效率。我得试一下,你可以查更多的信息。这是一种类似的用例。根据上面的线程,我猜使用
ThreadLocal
似乎很有效。它还说明了如何使用
requestscopebean
。这似乎更有效率。我必须试一试
RequestAttributes attribs = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = null;
if (attribs instanceof ServletRequestAttributes) {
    request = ((ServletRequestAttributes) attribs).getRequest();
}