2014-09-29 1 views
2

하나의 서버에서 Mongo 데이터베이스를 실행하고 JSON을 다른 서버의 프런트 엔드 응용 프로그램에 제공하려면이 두 가지 샘플 Java Spring 응용 프로그램을 함께 사용하려고합니다.Spring Java Mongo REST 응용 프로그램으로 CORS를 구성하는 방법은 무엇입니까?

CORS 튜토리얼 : REST http://spring.io/guides/gs/accessing-mongodb-data-rest/

나의 현재 "MongoDB를 REST와"Spring.io 샘플 응용 프로그램이 실행에 http://spring.io/guides/gs/rest-service-cors/

MongoDB를하지만, 현재 아직까지도 SimpleCORSFilter를 추가 한 후 CORS를 지원하지 않습니다 (위의 CORS 샘플에 나와있는 것처럼).

나는이 새로운 SimpleCORSFilter 클래스를 web.xml의 어노테이션에서 어딘가에 구성해야 할 필요가 있다고 생각하고 있으므로 SimpleCORSFilter 클래스에서 @WebFilter ("/ *")를 사용하려고합니다.

"MongoDB with REST"자습서 페이지에 따르면 "@Import (RepositoryRestMvcConfiguration.class) 주석은 Spring MVC 컨트롤러, JSON 변환기 및 RESTful 프론트 엔드를 제공하는 데 필요한 다른 Bean 콜렉션을 가져옵니다. Spring 데이터 MongoDB 백엔드까지. " 이것은 SimpleCORSFilter 필터를 구성하기 위해 RepositoryRestMvcConfiguration에서 무언가를 무효화해야한다는 것을 나타낼 수도 있습니다.

@WebFilter ("/ ")를 SimpleCORSFilter 클래스 자체에 추가하려고 시도했지만 curl --verbose를 사용하여 응답에 Access Control- 헤더가 표시되지 않습니다. 따라서 필자는 필터가 올바르게 구성되어 있다고 생각하지 않습니다.

누구나이 두 가지 튜토리얼 프로젝트 (또는 비슷한 것)를 결합하여 운이 좋았습니까?

package foo.bar; 
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.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 
import org.springframework.web.filter.OncePerRequestFilter; 

@WebFilter("/*") 
@Component 
public class SimpleCORSFilter extends OncePerRequestFilter implements Filter { 
/* Attempt #1 - based on original demo code from spring.io - could not get to work 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse response = (HttpServletResponse) res; 
     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"); 
     chain.doFilter(req, res); 
    } 
*/ 

// Attempt #2 - based on https://stackoverflow.com/questions/20583814/angular-and-cors which advised use of addHeader() instead of setHeader() - still no luck 
    @Override 
    protected void doFilterInternal(HttpServletRequest request, 
      HttpServletResponse response, FilterChain filterChain) 
      throws ServletException, IOException { 
     response.addHeader("Access-Control-Allow-Origin", "*"); 
     response.addHeader("Access-Control-Allow-Methods", 
       "GET, POST, PUT, DELETE, OPTIONS"); 
     response.addHeader("Access-Control-Allow-Headers", 
       "origin, content-type, accept, x-requested-with, sid, mycustom, smuser"); 
      filterChain.doFilter(request, response); 
    } 

    // unable to override this final method 
    //public void init(FilterConfig filterConfig) {} 

    public void destroy() {} 
} 

... 현재 구성을 수행 할 것으로 보인다 주요 응용 프로그램의 클래스는 여기에 있습니다 : : 참고로

, 나는 구성을 시도하고있는 SimpleCORSFilter 클래스는 여기

package foo.bar; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Import; 
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; 
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration; 

@Configuration 
@EnableMongoRepositories 
@Import(RepositoryRestMvcConfiguration.class) 
@EnableAutoConfiguration 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

참고 : 다소 비슷한 게시물을 여기에서 찾았습니다 : CORS with Spring not working,하지만이 솔루션은 JSONP를 사용합니다.이 JSONP는 해킹과 같은 것으로, 어떤 경우에는 해결되지 않는 것으로 보입니다.

+0

매우 동일한 문제가 있습니다. 컨트롤러가없는 스프링 데이터와 MongoRepository를 사용하고 있습니다. 헤더를 추가하고 아직 아무것도 추가하지 않는 필터를 구현했습니다. 나는 그 문제가 무엇인지 이해하지 못한다. 필터가 예상대로 작동하지 않는지 확인하기 위해로드되고 있습니다. –

답변

0

내가 비슷한 문제라고 생각하는 것을 실행하고있었습니다. 기본 인증을 해제하면 문제가 해결 된 것으로 보입니다.

+0

흥미 롭습니다. 그래서 나는 Oauth 나 다른 형태의 인증을 대신 사용한다고 가정합니다. 그렇다면 정교하게 작성하십시오. 감사합니다. –

+0

OAuth2를 사용하려고하지만 현재 보안 설정이되어 있지 않습니다. –

관련 문제