2017-03-07 53 views
3

我有一個使用Angular 2和Spring Boot開發的Web應用程序。我使用spring-boot-data-rest依賴關係將我的存儲庫公開爲HTTP端點。在Spring Data Rest中啓用交叉原點請求

在開發過程中,我在端口8080上運行的本地tomcat上運行我的後端彈簧引導項目。要開發前端,我使用angular-cli在端口4200上服務我的Angular 2應用程序。我的前端運行在4200需要能夠擊中暴露在8080上的端點,但這不起作用,因爲:

沒有'Access-Control-Allow-Origin'標頭存在於請求的資源上。因此不允許訪問原產地'http://localhost:4200'。

如果這些都是我手動在@RestController類型的定製終端,我可以簡單地添加@CrossOrigin註釋這樣:

@RestController 
public class MyController { 
    @CrossOrigin(origins = "http://localhost:4200") 
    @RequestMapping(value = "/whatever") 
    public void whatever() { 
     //whatever 
    } 
} 

但我顯然不能爲我的終點由spring-boot-data-rest暴露做到這一點。那麼,我怎樣才能讓這些端點可以從http://localhost:4200出發?

+1

我最近所面對的問題;如果您使用的是最新版本的Spring Data,那麼一切都會很順利(http://stackoverflow.com/a/42403956/4922375),否則,您必須自己寫一個過濾器,它爲每個響應設置一些標題。 – Andrew

回答

4

我用我的自定義過濾器CORS系統,使其工作:

/** 
* Filter for enabling CORS support. 
*/ 
@Component 
public class CorsFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, 
            final FilterChain filterChain) throws ServletException, IOException { 
     response.addHeader("Access-Control-Allow-Origin", "*"); 
     response.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, PATCH, HEAD, OPTIONS"); 
     response.addHeader("Access-Control-Allow-Headers", "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"); 
     response.addHeader("Access-Control-Expose-Headers", "Access-Control-Allow-Origin, Access-Control-Allow-Credentials"); 
     response.addHeader("Access-Control-Allow-Credentials", "true"); 
     response.addIntHeader("Access-Control-Max-Age", 10); 
     filterChain.doFilter(request, response); 
    } 
} 
0

也許你可以使用下面的組件來啓用CORS請求。 它在全球範圍內應用到應用程序

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

    public SimpleCorsFilter() { 
    } 

    @Override 
    public void destroy() { 
    } 

    @Override 
    public void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException { 
    final HttpServletResponse response = (HttpServletResponse) res; 
    final 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-Headers", "x-requested-with, authorization, token"); 

    if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { 
     response.setStatus(HttpServletResponse.SC_OK); 
    } else { 
     chain.doFilter(req, res); 
    } 
    } 

    @Override 
    public void init(final FilterConfig filterConfig) { 
    } 
}