如何将HttpServletRequest注入到Spring AOP请求中(自定义场景)? [英] How to inject HttpServletRequest into a Spring AOP request (custom scenario)?
本文介绍了如何将HttpServletRequest注入到Spring AOP请求中(自定义场景)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我知道围绕控制器方法编写AOP通知的标准方法,如果在控制器方法中声明,则可以访问HttpServletRequestArg。
但我的场景是,我有一个翻译服务,它当前是会话范围的,维护用户的翻译区域设置。我觉得这使得服务是有状态的,而且我不希望它是会话作用域,因为我认为它实际上是单例的。但是有多个地方调用翻译服务方法,因此我不想更改这些方法中的签名以添加请求/区域设置。问题是,翻译服务的方法的所有调用方都不能访问HttpServletRequest(不是控制器方法)?我是否可以围绕翻译服务方法编写一个方面,并以某种方式神奇地访问HttpServletRequest,而不管它是否在调用者的上下文中可用?
@Service
public class TranslationService {
public void translate(String key) {
...
}
}
@Aspect
@Component
public class LocaleFinder {
@PointCut("execution(* TranslationService.translate(..))")
private void fetchLocale() {}
@Around("fetchLocale()") // in parameter list
public void advice(JoinPoint joinpoint, HttpServletRequest request) { .... }
}
如果现在,翻译的调用方没有HttpServletRequest,我是否可以在通知中收到请求?是否有解决办法?
推荐答案
我是否可以围绕翻译服务方法和 以某种方式神奇地访问HttpServletRequest,而不管 它是否在调用方的上下文中可用?
不容易。事实上,这需要很大的努力。
最简单的方法是依赖RequestContextHolder
。在每个请求中,DispatcherServlet
将当前HttpServletRequest
绑定到RequestContextHolder
中的static ThreadLocal
对象。您可以在与
Thread
内执行时检索它
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
您可以在advice()
方法中执行此操作,因此不需要声明参数。
这篇关于如何将HttpServletRequest注入到Spring AOP请求中(自定义场景)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文