美文网首页
RestTemplate&SpringBoot拦截器实战

RestTemplate&SpringBoot拦截器实战

作者: Minato666 | 来源:发表于2018-04-12 22:58 被阅读0次

    之前项目中使用了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端。

    相关文章

      网友评论

          本文标题:RestTemplate&SpringBoot拦截器实战

          本文链接:https://www.haomeiwen.com/subject/cuofkftx.html