2017-06-28 2 views
1

In unserer Spring Boot App haben wir die erste Implementierung in unserer Quality-Umgebung vorgenommen. Jetzt möchten wir es einfacher machen, URLs für die Annahme von Petitionen aus unserer FrontEnd-Anwendung zu definieren.Wie behandelt man CORS-URLs in Prod/Dev-Umgebungen?

Wir bauen unsere Anwendung mit Maven und wir es dann mit dem Befehl ausführen

java -Dspring.profiles.active=prod -jar myapp-0.0.1-SNAPSHOT.jar 

Wir dachten, dass wir die URL auf der application.properties/application-prod.properties Datei einstellen könnten, aber das funktioniert nicht wie in der Ausführungszeit es null ist. Eine andere Problemumgehung wäre irgendwie, den Parameter -Dspring.profiles.active=prod zu erhalten, den wir beim Ausführen der Anwendung passieren und dann eine URL oder eine andere URL nehmen, aber das scheint ein bisschen dreckig zu sein ...

Also, was würdest du tun? Ich war beeindruckt, dass ich bei Google nichts gefunden habe. Offensichtlich haben die Leute unterschiedliche Problemumgehungen oder ich suche auf die falsche Weise.

bearbeiten Kreuz Herkunft Info: Dies ist, wie wir es auf den ersten umgesetzt.

@CrossOrigin(origins = BasicConfiguration.CLIENT_URL) 

Und das ist, wie wir es jetzt mit einem Filter mit Spring Security

public class CorsFilter implements Filter, ApplicationContextAware { 
    @Value("${urlServer}") 
    private String urlServer; 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse response = (HttpServletResponse) res; 
     response.setHeader("Access-Control-Allow-Origin", urlServer); 
     response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH"); 
     response.setHeader("Access-Control-Max-Age", "3600"); 
     response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
     response.setHeader("Access-Control-Expose-Headers", "Location"); 
     chain.doFilter(req, res); 
    } 

    @Override 
    public void init(FilterConfig filterConfig) {} 

    @Override 
    public void destroy() {} 
} 

Natürlich tun wollen urlServer in application.properties mit seinen entsprechenden Metadaten definiert ist.

EDIT 2 Wie ich den Filter initialisieren:

@Bean 
public FilterRegistrationBean corsFilter() { 
    FilterRegistrationBean registration = new FilterRegistrationBean(); 
    registration.setFilter(new CorsFilter()); 
    registration.addUrlPatterns("/sessionLogin"); 
    return registration; 
} 
+0

können Sie Ihren Code teilen, wo CORS Urls gesetzt wird ? Eigentlich sollte es perfekt mit application.properties funktionieren und das ist der richtige Weg zu tun – Leffchik

+0

https://stackoverflow.com/questions/44797127/spring-remove-printout-could-not-load-properties-from-url/44797337# comment76575201_44797337 So können Sie Eigenschaften aus externen Dateien definieren, die die von application.properties überschreiben. – StanislavL

+0

Wie erstellen Sie Ihr CorsFilter-Objekt? Ich schätze, Sie erstellen es einfach wie 'new CorsFilter()', also ist es keine Frühlingsbohne und es wird nicht vom Frühlingskontext verwaltet. Deshalb kann Ihre Eigenschaft nicht injiziert werden – Leffchik

Antwort

3

Das Problem ist, dass Sie CorsFilter ist kein Frühling Bohne. Sie können es eather definieren wie eine Bohne, oder etwas tun, wie folgt aus:

@Bean 
    public FilterRegistrationBean corsFilter(@Value("${app.cors.url.server}") String urlServer) { 
     FilterRegistrationBean registration = new FilterRegistrationBean(); 
     CorsFilter corsFilter = new CorsFilter(); 
     corsFilter.setUrlServer(urlServer); 
     registration.setFilter(corsFilter); 
     registration.addUrlPatterns("/sessionLogin"); 
     return registration; 
    } 

Natürlich müssen Sie Setter in Ihrem CorsFilter für urlServer Feld definieren

+0

Vielen Dank! Ich habe schließlich eine andere Methode gefunden, um einen neuen Corsfilter() mit einer @Bean-Annotation zurückzugeben. Es hat funktioniert! Tatsächlich bestand das Problem darin, dass die Initialisierung des CorsFilters nicht mit Spring Context erfolgte. – Carloshf

Verwandte Themen