2016-05-31 6 views
1

Wenn ich zuul Routen in bootstrap.properties, mein TestHandlerInterceptor definiert in gareway Anwendung so konfigurieren, ist nicht für alle Anforderung aufgerufen zu werden passende /Anmeldungen aber es wird gefordert alle anderen Anfrage TestHandlerInterceptor.preHandle erfolgreichInterceptor nicht genannt wurden, wenn zuul.routes in Gateway konfiguriert

bootstrap.properties verarbeitet zu werden

zuul.routes.registration-service.path=**registrations** 
zuul.routes.registration-service.service=registration-service 

TestHandlerInterce ptor.java

public class TestHandlerInterceptor implements HandlerInterceptor { 


@Autowired 
AuthenticationService authenticationService; 


@Override 
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { 

    System.out.println(" ********* preHandle ********"); 
    boolean result = true; 
    if(!authenticationService.isAuthenticated(httpServletRequest)){ 
     result = false; 
     httpServletResponse.setStatus(401); 
    } 


    return result; 
} 

@Override 
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { 

} 

@Override 
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { 

} 
} 

GatewayApplication.java

@EnableZuulProxy 
@SpringBootApplication 
@EnableDiscoveryClient 
public class GatewayApplication{ 

public static void main(String[] args) { 
    SpringApplication.run(GatewayApplication.class, args); 
} 

@Bean 
public WebMvcConfigurerAdapter adapter() { 
    return new WebMvcConfigurerAdapter() { 
     @Override 
     public void addInterceptors(InterceptorRegistry registry) { 
      registry.addInterceptor(new TestHandlerInterceptor()); 
      super.addInterceptors(registry); 
     } 
    }; 
} 
} 


@RestController 
class Orchestration { 
@LoadBalanced 
@Autowired 
    private RestTemplate restTemplate ; 

@RequestMapping("/api/test") 
public @ResponseBody 
Collection<Registration> getRegistrations(){ 
    ResponseEntity<Resources<Client>> resourceResponseEntity = this.restTemplate.exchange("http://registration-service/registrations", HttpMethod.GET,null, ptr); 

} 

} 

Die TestHandlerInterceptor.preHandle führt für localhost: 1122/api/Test, aber es ist nicht für localhost genannt zu werden: 1122/Anmeldungen

Ich bin Ich versuche, einen AuthenticationService in meinem Interceptor hinzuzufügen, der die gesamte statusfreie Authentifizierung (unter Verwendung von API-Schlüsseln) durchführt, bevor eine der Unterressourcen angefordert wird.

versuchte ich ZuulFilter Umsetzung und die MyZuulFilter.run() ist Aufruf für alle localhost: 1122/Anmeldungen verlangen, aber nicht für localhost: 1122/api/test

Wie kann ich die Abfangjäger in so konfigurieren, dass seine bekommt, bevor irgendetwas anderes

pom.xml

<parent> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-parent</artifactId> 
    <version>Angel.SR6</version> 
</parent> 

Dank Ravi

Antwort

0

Try modi ausgeführt fying WebMvcconfigurator Bohne wie unten

@Bean 
public WebMvcConfigurerAdapter adapter() { 
    return new WebMvcConfigurerAdapter() { 
     @Override 
     public void addInterceptors(InterceptorRegistry registry) { 
      registry.addInterceptor(new TestHandlerInterceptor(()).addPathPatterns("/**") 
     } 
    }; 
} 
} 

auch die Bootstrap ändern Eigenschaften: -

zuul.routes.registration-service.path=/registrations/** 
zuul.routes.registration-service.service=registration-service 
+0

Hinzufügen addPathPatterns („/ **“) nicht gab erwartetes Ergebnis .. kann ich etwas falsch – Ravi

+0

die Antwort aktualisiert tue vielleicht müssen Sie den Pfad Muster ändern. Können Sie den Registrierungsdienst über Zuul erreichen? –

+0

Bereits zuul.routes.registration-service.path = ** Registrierungen ** zuul.routes.registration-service.service = Registrierungs-Service im Bootstrap. Ich kann den Dienst über Zuul starten, aber mein Interceptor wird nicht angerufen. Vorläufig habe ich meinen Code für die Authentifizierung (mit API-Schlüsseln) in ZuulFilter.run() wiederholt. Jetzt existiert der Code an zwei Stellen Filter und Interceptor, die ich zu vermeiden versuche – Ravi

1

Blick auf diese. HandlerInterceptorAdapter and Zuul Filter

@Configuration 
@RequiredArgsConstructor 
public class ZuulHandlerBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter { 

    private MyInterceptor myInterceptor = new MyInterceptor(); 

    @Override 
    public boolean postProcessAfterInstantiation(final Object bean, final String beanName) throws BeansException { 
     if (bean instanceof ZuulHandlerMapping) { 
      ZuulHandlerMapping zuulHandlerMapping = (ZuulHandlerMapping) bean; 
      Object[] objects = {oauth2Interceptor}; 
      zuulHandlerMapping.setInterceptors(objects); 
     } 
     return super.postProcessAfterInstantiation(bean, beanName); 
    } 
}