RequestContextHolder.getRequestAttributes()在第二次调用时返回null

时间:2018-06-14 12:22:22

标签: java spring keycloak

我使用RequestionContextHolder时遇到了问题。我有一个keycloak令牌存储在上下文持有者的属性中。我得到了该行的属性:

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();

我多次需要这个keycloak令牌。

首先,在登录后,我获得requestAttributes然后获得令牌(一切都很好)。

然后我在使用应用程序时需要它(在点击一下之后),RequestContextHolder.getRequestAttributes()返回null(然后不那么好)。

我不明白为什么第一次都运行良好然后它只返回null。

我试图把它放在web.xml中,但它没有改变任何东西:

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

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

您的应用程序中的每次单击都是单独的请求,因此它们都有一个单独的RequestContext。似乎令牌仅针对此登录请求放入请求上下文中。可能是通过keycloak整合。

您可能需要在以下请求中识别您的用户。这将是一个会话,有不同的类型可用。然后,您的客户端需要在每次请求时发送sessionid或令牌。

有关详细信息,您需要向我们提供更多背景信息。你是如何整合keycloak的?您想对令牌做什么?

答案 1 :(得分:0)

单独调用中的每个HTTP请求。因此,一旦登录成功,您可以保留令牌。可以使用过滤器。

你可以做的一种方法是在Session中添加它,就像这样

使用过滤器可以获得HttpSession并像这样添加令牌。

HttpServletRequest req;

HttpSession session=req.getSession();

session.setAttribute("mytoken","token");

稍后您可以在每次通话中以这样的方式阅读

@GetMapping("logdetail")
public void getAllLogs(HttpSession session) {
    session.getAttribute("mytoken");
}