2017-10-13 45 views

回答

0

我已经完成了任务,创建自定义过滤器

public class RequestFilter implements Filter{ 



    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 

     HttpServletRequest httpServletRequest = (HttpServletRequest) request; 
     String token = httpServletRequest.getHeader(RequestContext.REQUEST_HEADER_NAME); 

     if (token == null || "".equals(token)) { 
      throw new IllegalArgumentException("Can't retrieve JWT Token"); 
     } 

     RequestContext.getContext().setToken(token); 
     chain.doFilter(request, response); 

    } 

    @Override 
    public void destroy() { } 

    @Override 
    public void init(FilterConfig arg0) throws ServletException {} 


} 

然后,在我的配置

@Bean 
public FilterRegistrationBean getPeticionFilter() { 

    FilterRegistrationBean registration = new FilterRegistrationBean(); 
    registration.setFilter(new RequestFilter()); 
    registration.addUrlPatterns("/*"); 
    registration.setName("requestFilter"); 

    return registration; 
} 

考虑到这一点,我已经创建另一个类有一个ThreadLocal变量传递JWT设置从控制器到休息Templace拦截

public class RequestContext { 

public static final String REQUEST_HEADER_NAME = "Authorization"; 

private static final ThreadLocal<RequestContext> CONTEXT = new ThreadLocal<>(); 

private String token; 

public static RequestContext getContext() { 
    RequestContext result = CONTEXT.get(); 

    if (result == null) { 
     result = new RequestContext(); 
     CONTEXT.set(result); 
    } 

    return result; 
} 

public String getToken() { 
    return token; 
} 

public void setToken(String token) { 
    this.token = token; 
} 

}

public class RestTemplateInterceptor implements ClientHttpRequestInterceptor{ 

@Override 
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { 

    String token = RequestContext.getContext().getToken(); 

    request.getHeaders().add(RequestContext.REQUEST_HEADER_NAME, token); 

    return execution.execute(request, body); 

} 

} 
令牌

添加拦截器的配置

@PostConstruct 
public void addInterceptors() { 
    List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors(); 
    interceptors.add(new RestTemplateInterceptor()); 
    restTemplate.setInterceptors(interceptors); 
} 
2

基本上你的令牌应该位于请求的头部,例如:Authorization:Bearer。为了得到它,你可以在你的控制器检索由@RequestHeader()的任何标头值:

@GetMapping("/someMapping") 
public String someMethod(@RequestHeader("Authorization") String token) { 

} 

现在,你可以把令牌中的报头中的以下请求:

HttpHeaders headers = new HttpHeaders(); 
headers.set("Authorization", token); 

HttpEntity<RestRequest> entityReq = new HttpEntity<RestRequest>(request, headers); 

现在,你可以通过在HttpEntity您休息的模板:

template.exchange("RestSvcUrl", HttpMethod.POST, entityReq, SomeResponse.class); 

希望我能帮助

+0

完全吻合。你可以使用任何头文件。 – eis

+0

似乎非常稳固的解决方案,但它有点“手工工艺”。我正在寻找使用像ClientHttpRequestInterceptor这样的拦截器的不同解决方案。但我不知道如何从那里取回令牌。例如,TraceInterceptorConfiguration的sleuth库也是这样做的。不需要手动添加标题 – dragonalvaro

+0

或者您可以使用控制器通知(类级别注释)而不是拦截器。你也有可能注入头文件 –