2016-09-22 64 views
4

這裏是我的webConfigCORS不工作的我的春天啓動應用程序

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 

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

我有一個/health端點,它返回一些健康數據,並能正常工作。

這裏是JUnit測試

@Test 
    public void corsTest() { 
     HttpHeaders headers = new HttpHeaders(); 
     headers.add(HttpHeaders.ORIGIN, "http://localhost:9000"); 
     HttpEntity<?> requestEntity = new HttpEntity(headers); 
     ResponseEntity<Status> entity = this.restTemplate.exchange("/health", HttpMethod.GET, requestEntity, Status.class); 
     assertEquals(HttpStatus.OK, entity.getStatusCode()); 
     assertEquals("http://localhost:9000", entity.getHeaders().getAccessControlAllowOrigin()); //6 
     Status health = entity.getBody(); 
     assertThat(health.getAppName()).isEqualTo(appName); 
    } 

測試失敗在行,如果註釋出該行,測試通過6.。 通過調試器,我發現entity.getHeaders().getAccessControlAllowOrigin()爲空。我用這個sample app作爲參考,它工作正常。但對於我的應用程序而言,它失敗

當我使用JavaScript調用/健康api時,我可以看到cors的作品。如果我註釋掉webConfig類,我會在javascript中出錯。在javascript中調試更多時,表明未設置cors響應頭,但啓用webconfig時請求已成功完成。

所以絕對cors作品。這是失敗的測試。所以我猜測測試沒有看到它,因爲我不知道的原因。

+0

CORS只適用於AJAX請求,所以編寫模擬JAVA客戶端的測試很奇怪。 – zeroflagL

+0

@zeroflagL:我感覺一樣。但我上面給出的鏈接已經用java編寫了測試。所以我試圖效仿它 –

回答

8

我想你需要添加cors來源過濾器,我不確定,但我認爲這下面的解決方案是適合你的。

import java.io.IOException; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.core.Ordered; 
import org.springframework.core.annotation.Order; 
import org.springframework.http.HttpMethod; 
import org.springframework.http.HttpStatus; 
import org.springframework.stereotype.Component; 

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

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

     HttpServletResponse response = (HttpServletResponse) res; 
     HttpServletRequest request = (HttpServletRequest) req; 
     response.setHeader("Access-Control-Allow-Origin", "*"); 
     response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 
     response.setHeader("Access-Control-Max-Age", "3600"); 
     response.setHeader("Access-Control-Allow-Credentials", "true"); 
     response.setHeader("Access-Control-Allow-Headers", "Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization"); 
     if(request.getMethod().equals(HttpMethod.OPTIONS.name())){ 
      response.setStatus(HttpStatus.NO_CONTENT.value()); 
     }else{ 
      chain.doFilter(req, res); 
     } 
    } 

    public void init(FilterConfig filterConfig) {} 

    public void destroy() {} 
} 
2

正如我解釋here它需要設置之前加載errorPageFilter從彈簧引導的corsfilter。否則,CORS支持將被打破,並且不會引入所需的標題。這可以通過如上所述的@Order(Ordered.HIGHEST_PRECEDENCE)來完成。

+0

我沒有使用過濾器 –

+0

您的解決方案對我來說工作正常。但是,我不明白爲什麼。我認爲這是CorsFilter的缺陷或缺點。 – chenatu

+0

不知道我明白...這只是訂單註釋不起作用? – megalucio

0

我假設你沒有使用annotation驅動的cors配置,但是java配置了一個。

在這種情況下,我發現你發佈的例子和github中的例子有所不同。

後者使用

registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000"); 

,而你的榜樣錯過了allowedOrigins

registry.addMapping("/greeting-javaconfig"); 

我認爲,這使得這裏的區別。

+0

我允許起源*。這就是爲什麼它錯過了它 –

相關問題