我可以像这样简单地通过@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();
}
}