Web services 为什么我的本地网站无法访问我的本地REST服务?
我有一个Spring MVC REST服务,通过8080端口上的Tomcat在本地运行。当我通过浏览器或fiddler直接点击服务时,它会按预期工作。我还用AngularJS建立了一个本地网站。如果我将这个网站放在Tomcat目录中,并导航到Tomcat提供的网站链接,那么一切仍然正常 问题是我没有将网站放在Tomcat目录中。假设我将网站项目放在桌面上,然后导航到一个页面,该页面应该从本地REST服务检索数据。。。我可以在fiddler中看到请求正在通过,命中服务,服务返回数据。。。但是网站没有显示它 为什么只有当Tomcat同时提供这两种服务时,它才能正常工作 直接链接到hit服务: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中看到请求正在通过,命中服务,服务返回数据。。。但是网站没
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的简单过滤器,例如处理选项飞行前请求。