在Spring MVC中访问ClientHttpRequestInterceptor中的HttpSession

时间:2015-09-30 10:59:13

标签: java spring spring-mvc httpsession

我只需使用@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

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用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();
        }
    }

答案 1 :(得分:0)

我认为这个ClientHttpInterceptor课程的用法并不恰当,因为正如我在doc

中所看到的那样
  

拦截客户端HTTP请求。可以使用RestTemplate

注册此接口的实现

表示如果服务器的行为类似于客户端,则可以使用此拦截器,例如,您希望修改使用RestTemplate发送的每个请求。 ClientHttpInterceptor here的示例用法。

您应该使用HandlerInterceptor。请参阅好文章here