我有一个通过端口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() {}
}
我想你”我们需要的不仅仅是一个简单的CORS过滤器,比如处理OPTIONS预检请求。 –