Web services 为什么我的本地网站无法访问我的本地REST服务?

Web services 为什么我的本地网站无法访问我的本地REST服务?,web-services,angularjs,rest,tomcat,spring-mvc,Web Services,Angularjs,Rest,Tomcat,Spring Mvc,我有一个Spring MVC REST服务,通过8080端口上的Tomcat在本地运行。当我通过浏览器或fiddler直接点击服务时,它会按预期工作。我还用AngularJS建立了一个本地网站。如果我将这个网站放在Tomcat目录中,并导航到Tomcat提供的网站链接,那么一切仍然正常 问题是我没有将网站放在Tomcat目录中。假设我将网站项目放在桌面上,然后导航到一个页面,该页面应该从本地REST服务检索数据。。。我可以在fiddler中看到请求正在通过,命中服务,服务返回数据。。。但是网站没

我有一个Spring MVC REST服务,通过8080端口上的Tomcat在本地运行。当我通过浏览器或fiddler直接点击服务时,它会按预期工作。我还用AngularJS建立了一个本地网站。如果我将这个网站放在Tomcat目录中,并导航到Tomcat提供的网站链接,那么一切仍然正常

问题是我没有将网站放在Tomcat目录中。假设我将网站项目放在桌面上,然后导航到一个页面,该页面应该从本地REST服务检索数据。。。我可以在fiddler中看到请求正在通过,命中服务,服务返回数据。。。但是网站没有显示它

为什么只有当Tomcat同时提供这两种服务时,它才能正常工作

直接链接到hit服务:
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() {}

}

您需要将正确的配置添加到允许飞行前请求的应用程序中。下面是一个配置示例:

<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>

科尔斯
com.thetransactioncompany.cors.CORSFilter
cors.allowgenerichtt前传
真的
金鸡儿
*
cors.allowSubdomains
假的
cors.supportedMethods
获取、标题、发布、放置、删除、选项
cors.supportedHeaders
*
cors.supportsCredentials
真的
科斯马克萨奇酒店
3600
cors.tag请求
真的
科尔斯
/原料药/*

感谢您提供上述答案。原来我的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, "/*");
    }

有关更多信息,请参见此处:

我认为您需要的不仅仅是CORS的简单过滤器,例如处理选项飞行前请求。