如何将HttpServletRequest注入到Spring AOP请求中(自定义场景)? [英] How to inject HttpServletRequest into a Spring AOP request (custom scenario)?

查看:0
本文介绍了如何将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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆