2014-09-29 3 views
2

Я пытаюсь объединить эти два примера приложений Java Spring вместе, чтобы иметь возможность запускать мою базу данных Mongo на одном сервере и обслуживать JSON для внешнего приложения на другом сервере.Как настроить CORS с помощью приложения Spring REST Spring Java?

CORS учебник: http://spring.io/guides/gs/rest-service-cors/

MongoDB с REST http://spring.io/guides/gs/accessing-mongodb-data-rest/

Мои текущие "MongoDB с REST" Spring.io работает приложение образца, но в настоящее время он еще не поддерживает CORS даже после добавления SimpleCORSFilter класс, как показано в образце CORS (см. выше).

Я думаю, что мне просто нужно настроить этот новый класс SimpleCORSFilter где-нибудь - в эквиваленте аннотации web.xml - поэтому я пытаюсь использовать @WebFilter ("/ *") в классе SimpleCORSFilter.

В соответствии с учебной страницей «MongoDB with REST» в аннотации @Import (RepositoryRestMvcConfiguration.class) импортируется коллекция контроллеров Spring MVC, преобразователей JSON и других компонентов, необходимых для обеспечения интерфейса RESTful. вплоть до данных Spring MongoDB. » Это может указывать на то, что я также должен переопределить что-то в RepositoryRestMvcConfiguration, чтобы настроить фильтр SimpleCORSFilter.

Я попытался добавить @WebFilter ("/ ") в класс SimpleCORSFilter, но я не вижу заголовков Access-Control- в ответе с помощью curl -verbose. В результате я не думаю, что фильтр настроен правильно.

Неужели кому-то повезло с объединением этих двух учебных проектов (или чего-то подобного?)?

Для справки, класс SimpleCORSFilter Я пытаюсь настроить здесь:

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() {} 
} 

... и основной класс приложений, которые в настоящее время, кажется, выполняет настройку здесь:

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, которое я также читал, было своего рода взломом, и в любом случае эта проблема также не решена.

+0

Имея ту же проблему. Я использую весенние данные и MongoRepository без контроллеров. Реализован фильтр, чтобы добавить заголовки и все еще ничего. Я не понимаю, в чем проблема. Фильтр загружается наверняка, он просто не делает того, что ожидается. –

ответ

0

Я сталкивался с тем, что, по моему мнению, является аналогичной проблемой. Выключение базовой аутентификации, похоже, разрешило это.

+0

Интересно. Поэтому я предполагаю, что вместо этого вы используете Oauth или какую-то другую форму аутентификации - правильно? Если да, пожалуйста, уточните. Спасибо –

+0

Я намерен использовать OAuth2, но на данный момент у меня нет настроенной безопасности. –

Смежные вопросы