为Spring控制器/服务类中的每个请求访问过滤器中计算的数据
在我们的应用程序中,所有rest API的形式如下: http://{context}/{product\u id}/{rest\u url\u path} 我必须通过从数据库中获取产品id的为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
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();
}