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端。

上一篇下一篇

猜你喜欢

热点阅读