gpt4 book ai didi

java - Jersey + Spring 上下文在 Controller 之外

转载 作者:行者123 更新时间:2023-11-30 09:17:44 25 4
gpt4 key购买 nike

我有一个需要来自请求的信息的 Spring bean,但不是直接从 Controller 调用的(虽然它可能是 - 但我想在没有它的情况下尝试这个)

基本上,我的 API 通过 thrift 向其他服务发出请求。当它发出请求时,有一个这样的服务调用:

authenticationService.authenticate(null, "username", "password");

第一个参数(null)通常是请求上下文的“占位符”实例。请求上下文包含有关发出请求的用户、原始 IP 等信息。通过这种方式,我可以获得有关原始调用者的所有详细信息,而不会让我的 API 基础架构泄漏到后端。

但是,为了做到这一点,我有一个 InvocationHandler 可以拦截针对我的服务接口(interface)代理进行的方法调用。在该代理处理程序内部,我连接了一个 RequestContextFactory,用于创建 RequestContext 的实例。在这个工厂内部,我需要从请求中获取信息。特别是 SecurityContext,因此我可以识别发出调用的用户。

现在,我有:

@Provider
@Component
public class WebRequestContextFactory implements RequestContextFactory {
@Context private ContainerRequest containerRequest;

public RequestContext createRequestContext() {

}
}

不幸的是,containerRequest 始终为 null

最佳答案

您可以使用 ServletRequestAttributesrequest 获取信息,ServletRequestAttributes 可以从 RequestContextHolder 获取:

ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
.currentRequestAttributes();

如果请求由 Spring DispatcherServlet 处理,则不需要任何特殊设置。 DispatcherServlet 已经公开了所有相关状态。但是如果请求是在 Spring 的 DispatcherServlet 之外处理的,那么您需要在应用程序的 web.xml 文件中添加 javax.servlet.ServletRequestListener:

    <listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

这会将请求与当前线程相关联,然后可以通过 RequestContextHolder 检索关联的请求属性。

关于java - Jersey + Spring 上下文在 Controller 之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18817162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com