ClientHttpRequestInterceptor

ClientHttpRequestInterceptor

我可以像这样简单地通过@Autowired访问Spring MVC控制器中的会话:

@Autowired
private HttpSession session;

问题是,我现在可以在ClientHttpRequestInterceptor中访问该会话。

我尝试了RequestContextHolder.getRequestAttributes(),但是结果是(有时-这是一个真正的问题)null。我也用RequestContextHolder.currentRequestAttributes()尝试过,但是IllegalStateException抛出以下消息:

找不到线程绑定的请求:您是在实际Web请求之外引用请求属性,还是在原始接收线程之外处理请求?如果您实际上是在Web请求中操作并且仍然收到此消息,则您的代码可能在DispatcherServlet / DispatcherPortlet之外运行:在这种情况下,请使用RequestContextListener或RequestContextFilter公开当前请求。
RequestContextListener已注册在web.xml中。
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

当我直接在ClientHttpRequestInterceptor中注入会话时,存在相同的问题。
@Autowired
private HttpSession session;

我的问题是:如何访问HttpSession中的当前ClientHttpRequestInterceptor

谢谢!

最佳答案

您可以通过在HttpSession中使用以下命令来访问ClientHttpRequestInterceptor:

public class CustomInterceptor implements ClientHttpRequestInterceptor {
        @Override
        public ClientHttpResponse intercept(HttpRequest request,
                                            byte[] body,
                                            ClientHttpRequestExecution execution) throws IOException {
            HttpServletRequest httpServletRequest = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
            // get the current session without creating a new one
            HttpSession httpSession = httpServletRequest.getSession(false);
            // get whatever session parameter you want
            String sessionParam = httpSession.getAttribute("parameter")
                                             .toString();
        }
    }

09-29 21:27