2016-06-29 12 views
0

Ich muss CORS für Spring-Anwendung aktivieren, die Spring Security verwendet, und es funktioniert nicht. Ich mache GET Anfrage von http://localhost:3000 (die node.js Server ist) zu http://localhost:8080 (die Tomcat-Server ist).Aktivieren des CORS-Spring-Problems mit Spring Security

habe ich versucht, die folgenden Ansätze können aber nicht machen jede von ihnen arbeiten: https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

Spring Data Rest and Cors

https://gist.github.com/zeroows/80bbe076d15cb8a4f0ad

Enabling CORS using Spring Boot 1.3.3-RELEASE

Spring CORS controller annotation not working

Zur Zeit habe ich eine @Controller:

@Controller 
@RequestMapping("/views") 
public class LoginController{ 

@Autowired 
private EventService eventService; 

@RequestMapping(value = "/companies", method = RequestMethod.GET, produces = "application/json") 
@ResponseBody 
    public String listCompanies(Model model) { 
     String companiesList = eventService.getCompanies(); 
     return companiesList; 
    } 
} 

Und AppConfig Datei, wo ich erfolglos versucht CORS zu ermöglichen:

@EnableWebMvc 
@Configuration 
public class AppConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addCorsMappings(CorsRegistry registry) { 
     registry.addMapping("/**"); 
    } 
} 

Ich mag irgendwie die json aus der listCompanies Methode in meinen Angular2 App bekommen. Ich bekomme No 'Access-Control-Allow-Origin' header is present Fehler, also nehme ich an, es ist CORS Problem.

+0

können Sie versuchen allowedMethods Zugabe ("\ *"), wie registry.addMapping ("/ **"). allowedMethods ("\ *"); –

+0

Den gleichen Fehler im Browser geben. In der Eclipse-Konsole sehe ich 'Zugriff verweigert '(Benutzer ist anonym)'. Ich habe Spring Security-Login dort, also versucht es wahrscheinlich, mich zur Login-Seite umzuleiten. –

+0

Ich brauche nur eine Lösung für die lokale Entwicklung, nicht für die Produktion, also wenn Spring Security das Problem verursacht, dann kann es irgendwie zu lösen, aber ich weiß nicht wie (und es sollte nicht zu viele Änderungen sein, da es wird Lokale Entwicklung schlechter machen) –

Antwort

0

Haben Sie irgendwo die zulässige Herkunft im Frühling definiert? http://localhost:8080

@EnableWebMvc 
@Configuration 
public class AppConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addCorsMappings(CorsRegistry registry) { 
     registry.addMapping("/**") 
     .allowedOrigins("http://localhost:3000") 
     .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") 
     .allowCredentials(true); 
    } 
} 

Blick auf Kapitel 27.3 der offiziellen Dokumente globale CORS-Konfiguration zu aktivieren: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.html

Wenn Sie nicht brauchen, um Cookies auf Cross-Origin-Anfrage enthalten, ersetzt .allowCredentials(true) durch .allowCredentials(false)

+0

Ich habe es versucht, funktioniert nicht. –

+0

Ich habe meinen Beitrag bearbeitet. Der Ursprung muss localhost: 3000 (Ihr Knotenserver) sein, nicht localhost: 8080. Ansonsten kannst du es mit der * wilcard versuchen, aber es wird nicht für die Produktion empfohlen! – MGR

+0

Ich weiß, funktioniert nicht. –

0

Ich hatte ähnliches Problem und reparierte es mit benutzerdefiniertem Filter, wie in der Dokumentation beschrieben: 27.5 Filter based CORS support

Bas (Oder entsprechende Java-basierte config) vor springSecurityFilterChain wie diese

public class MyCorsFilter extends CorsFilter { 

    public MyCorsFilter() { 
     super(configurationSource()); 
    } 

    private static UrlBasedCorsConfigurationSource configurationSource() { 
     CorsConfiguration config = new CorsConfiguration(); 
     config.addAllowedOrigin("*"); 
     config.addAllowedMethod("*"); 
     config.addAllowedHeader("*"); 
     config.setAllowCredentials(true); 
     UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 
     source.registerCorsConfiguration("/**", config); 
     return source; 
    } 

} 

und es dann in web.xml hinzufügen: matisch, müssen Sie Filter erstellen

<filter> 
    <filter-name>corsFilter</filter-name> 
    <filter-class>com.example.configuration.cors.MyCorsFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>corsFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Ich habe auch dispatchOptionsRequest (was nicht notwendig nach der neuen Dokumentation):

<servlet> 
    <servlet-name>appServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    ... 
    <!-- "OPTIONS" method support --> 
    <init-param> 
     <param-name>dispatchOptionsRequest</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    ... 
</servlet> 
0
import java.io.IOException; 

import javax.servlet.FilterChain; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
import org.springframework.web.filter.OncePerRequestFilter; 

/** 
* Enabling CORS support - Access-Control-Allow-Origin 
* 
* 
* <code> 
    <!-- Add this to your web.xml to enable "CORS" --> 
    <filter> 
     <filter-name>cors</filter-name> 
     <filter-class>com.elm.mb.rest.filters.CORSFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>cors</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
* </code> 
*/ 
public class CORSFilter extends OncePerRequestFilter { 
    private static final Log LOG = LogFactory.getLog(CORSFilter.class); 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 
     response.addHeader("Access-Control-Allow-Origin", "*"); 

     if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) { 
      LOG.trace("Sending Header...."); 
      // CORS "pre-flight" request 
      response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); 
//   response.addHeader("Access-Control-Allow-Headers", "Authorization"); 
      response.addHeader("Access-Control-Allow-Headers", "Content-Type"); 
      response.addHeader("Access-Control-Max-Age", "1"); 
     } 

     filterChain.doFilter(request, response); 
    } 

} 
+0

Eine Erklärung wäre nett. – zx485