2016-08-04 36 views
1

Ich habe Rest Web-Dienste mit Spring implementiert. Wenn ich es in Eclipse als Spring Boot-Anwendung bereitgestellt habe, funktioniert es. Wenn ich es jedoch in Tomcat 7 auf demselben Computer installiert habe, funktioniert es nicht. Die Fehlermeldung lautet wie folgt:Rest-Service funktioniert, wenn in Eclipse, aber nicht in Tomcat

XMLHttpRequest cannot load http://localhost:8080/ristoreService/oauth/token. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:8081' is therefore not allowed access. 

Meine CORS-Filter wie folgt aussehen:

@Component 
@Order(Ordered.HIGHEST_PRECEDENCE) 
public class CORSFilter implements Filter { 

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

     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 

     response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8081"); 
     response.setHeader("Access-Control-Allow-Credentials", "true"); 
     response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 
     response.setHeader("Access-Control-Max-Age", "3600"); 
     response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me, " 
       + "Origin,Access-Control-Request-Method, Access-Control-Request-Headers, Authorization"); 
     if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { 
      response.setStatus(HttpServletResponse.SC_OK); 
     } else { 
      chain.doFilter(req, res); 
     } 
    } 

Wenn ich response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8081"); auf Kommentar, ich immer noch die gleichen Fehler. Ohne diese Zeile würde es auch dann nicht funktionieren, wenn ich es in Eclipse deploye. Warum verhält es sich anders, wenn es in einer anderen Umgebung auf der gleichen IP bereitgestellt wird?

EDIT: ich die URL http://localhost:8080/ristoreService/oauth/token mit Rest-Client-Tester „CocoaRestClient“ getestet und bekam 404. Also machte ich eine URL auf, die anscheinend nicht http://localhost:8080/xxxxx existiert und es in UI (AngularJS) laufen und bekam wieder die CORS Fehler. Ich denke der Fehler ist irgendwie irreführend, es ist immerhin ein 404. Aber wieso klagt es nicht, als der Krieg mit dem Namen ristoreService.war unter Webapps in Tomcat erfolgreich eingesetzt wurde?

+0

bezogen werden: http://stackoverflow.com/questions/1653308/access-control-allow-origin-multiple-origin- Domänen – Kadima

+0

Was ist der Fehler? – Ulises

+0

@Ulises Erwähnt in meinem Beitrag 'Antwort auf Preflight-Anfrage nicht übergeben Kontrolle der Zugangskontrolle: Keine 'Access-Control-Allow-Origin'-Header ist auf der angeforderten Ressource vorhanden. Origin 'http://127.0.0.1:8081' ist daher nicht erlaubt. " – ddd

Antwort

0

Nach How to deploy Spring Boot application, ich habe Hauptanwendung machen SpringBootServletInitializer zu verlängern. Sobald ich das hinzugefügt habe, funktioniert es.

+0

Ok, ja, ich nahm das für selbstverständlich, ich denke, ich hätte fragen können. – Ulises

+0

Können Sie diese Lösung über Git teilen, wenn es kein Geheimnis ist? – Sergii

1

Versuchen Sie es mit einem FilterRegistrationBean. Sieht so aus in Java Config:

Gibt es einen Grund, warum Sie die CORS-Funktionen von Spring Boot nicht verwenden? Es ist bereits standardmäßig unterstützt, Sie müssen es nur konfigurieren. Sie können es so global aktivieren:

@Bean 
    public WebMvcConfigurer corsConfigurer() { 
     return new WebMvcConfigurerAdapter() { 
      @Override 
      public void addCorsMappings(CorsRegistry registry) { 
       registry.addMapping("/**").allowedOrigins("*"); 
      } 
     }; 
    } 
+0

Spring Boot's eigener corsConfigurer sollte genauso funktionieren wie der CORSFilter, den ich hatte, oder? Ich habe CorsMapping in meiner Anwendung hinzugefügt und habe immer noch den gleichen Fehler. Beachte, dass dieser Fehler möglicherweise nicht das ist, was er bedeutet. Da ich dieselbe URL in einem Rest-Client-Tester getestet habe und 404 bekommen habe, ist es vielleicht gar kein CORS-Problem. Aber warum 404? – ddd

+0

Wahrscheinlich setzen Sie in tomcat nicht den richtigen Kontextpfad. Wie konfigurierst du Tomcat? – Ulises

+0

Ich habe keine Konfig für den Kontext Pfad. Alles ist Standard. – ddd

0

Um CORS Problem zu lösen, habe ich @CrossOrigin verwendet. Und ich habe meinen eigenen CORS-Filter nicht implementiert. Irgendeine Art Frühling haben bereits wenige addition solutions for CORS issue zur Verfügung gestellt.

Wenn Sie nur Ihre Filter benötigen könnte man es auf diese Weise verwenden:

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http.addFilterBefore(yourFilter); 
    ... 
}