2014-02-14 76 views
2

我有一个通过端口8080上的Tomcat本地运行的Spring MVC REST服务。当我通过浏览器或提琴手直接访问服务时,它按预期工作。我还有一个使用AngularJS构建的本地网站。如果我把这个网站放在Tomcat目录中并导航到由Tomcat提供的网站链接,那么一切仍然正常。为什么我的本地网站无法访问我的本地REST服务?

问题是,当我没有把网站放在Tomcat目录中。假设我将网站项目放置在桌面上,然后导航到应该从本地REST服务检索数据的页面...我可以在小提琴手中看到请求正在通过,击中服务,服务返回数据...但网站不显示它!

为什么只有当两者都由Tomcat提供时才能正常工作?

链接直接打服务: http://localhost:8080/CPProject/users(返回的所有用户,在JSON格式)

网站(这个工程): http://localhost:8080/CPWebsite/app/#/users

网站(不工作): http://localhost:63342/CPWebsite/app/index.html#/users(63342所使用的Webstorm港口7.0) 或 file:///C:/Users/someuser/CPWebsite/app/index.html#/users

我的角度控制器是这样的:

cpControllers.controller('UserListCtrl', 
    function($scope, $http) { 
     $http.get('http://localhost:8080/CP/users') 
      .success(function(data) { 
       $scope.users = data; 
      } 
     ) 
    } 
); 

我也在我的Sprint MVC服务创建的CORS过滤器:

@Component 
public class SimpleCORSFilter implements Filter { 

    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", "GET, POST, DELETE, PUT, OPTIONS, HEAD"); 
     response.setHeader("Access-Control-Max-Age", "3600"); 
     response.setHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept"); 
     chain.doFilter(req, res); 
    } 

    public void init(FilterConfig filterConfig) {} 

    public void destroy() {} 

} 
+1

我想你”我们需要的不仅仅是一个简单的CORS过滤器,比如处理OPTIONS预检请求。 –

回答

0

感谢您的回答。事实证明,我的CORS过滤器是很好,但我已经忘记了它的过滤器添加到我的应用程序初始化,以实际工作:

public class WebAppInitializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) { 
     WebApplicationContext rootContext = createRootContext(servletContext); 
     configureSpringMvc(servletContext, rootContext); 

     FilterRegistration.Dynamic corsFilter = servletContext.addFilter("corsFilter", SimpleCORSFilter.class); 
     corsFilter.addMappingForUrlPatterns(null, false, "/*"); 
    } 

这里看到更多的信息:http://jpgmr.wordpress.com/2013/12/12/cross-origin-resource-sharing-cors-requests-with-spring-mvc/

1

你需要添加正确的配置CORS filter你的应用程序,允许预检要求。这里有一个配置示例:

<filter> 
    <filter-name>CORS</filter-name> 
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class> 

    <init-param> 
     <param-name>cors.allowGenericHttpRequests</param-name> 
     <param-value>true</param-value> 
    </init-param> 

    <init-param> 
     <param-name>cors.allowOrigin</param-name> 
     <param-value>*</param-value> 
    </init-param> 

    <init-param> 
     <param-name>cors.allowSubdomains</param-name> 
     <param-value>false</param-value> 
    </init-param> 

    <init-param> 
     <param-name>cors.supportedMethods</param-name> 
     <param-value>GET, HEAD, POST, PUT, DELETE, OPTIONS</param-value> 
    </init-param> 

    <init-param> 
     <param-name>cors.supportedHeaders</param-name> 
     <param-value>*</param-value> 
    </init-param> 

    <init-param> 
     <param-name>cors.supportsCredentials</param-name> 
     <param-value>true</param-value> 
    </init-param> 

    <init-param> 
     <param-name>cors.maxAge</param-name> 
     <param-value>3600</param-value> 
    </init-param> 

    <init-param> 
     <param-name>cors.tagRequests</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>CORS</filter-name> 
    <url-pattern>/api/*</url-pattern> 
</filter-mapping> 
相关问题