RestTemplate&SpringBoot拦截器实战
2018-04-12 本文已影响0人
Minato666
之前项目中使用了springboot开发了一个项目,于是就使用到了RestTemplate和SpringBoot的Interceptor来实现通过http header的common方式来将UserID信息传递到SpringBoot端。
实现主要分为两个部分:
第一个部分是Client端,由于都是通过RestTemplate发起的service请求,所以我们很容易的想到对于RestTemplate的发起的每个请求,在请求的Header中加上userId的信息就行,因此为RestTemplate添加一个拦截器:
public class UserAgentInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body,
ClientHttpRequestExecution execution) throws IOException {
HttpHeaders headers = request.getHeaders();
headers.add("currentUser", Beans.get(LoginSessionBean.class).getCurrentUser());
return execution.execute(request, body);
}
}
然后通过Spring注入到RestTemplate的对象中:
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.FormHttpMessageConverter" />
<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</list>
</property>
<property name="interceptors">
<list>
<bean class="com.oocl.ir4.sps.web.service.resttemplate.UserAgentInterceptor"></bean>
</list>
</property>
</bean>
这样就可以在每个请求发出之前将userID信息添加到Header中。
第二个部分就是SpringBoot端从Header中获取这个UserID,并存储一个对象中,和RestTemplate类似首先需要添加一个Interceptor,重写preHandle方法,这个方法在会在Controller里面接收请求方法之前调用,其中UserSessionInfo这个对象的Scope是Request,这样每个请求共享一个UserSessionInfo对象,保证后面的Service处理的地方可以取到该UserSessionInfo对象:
@Component
public class UserInfoInterceptor implements HandlerInterceptor {
public static final String USER_ID = "currentUser";
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
UserSessionInfo userSessionInfo = SpringUtil.getBean(UserSessionInfo.class);
userSessionInfo.setUserId(request.getHeader(USER_ID));
return true;
}
}
然后注册这个拦截器:
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new UserInfoInterceptor());
}
}
这样我们就实现了通过http header的common方式来将UserID信息传递到SpringBoot端。