我有一种我无法理解的情况。两台计算机,其中一台我使用括号进行Web开发,另一台(Linux)我正在运行Tomcat(7)。两者都在同一个LAN内(因此地址范围相同)。我收到了标题中显示的错误,因此我完全被卡住了。尝试以下代码但没有成功:
var req = { url: l_url, method:"POST", headers: {
'Content-Type': 'application/x-www-form-urlencoded' ,
// 'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Origin': 'http://127.0.0.1',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, application/x-www-form-urlencoded'
}, data: l_params } ;
$http(req).
success(function(data, status, headers, config) {
console.log("DB_Services - Success; data is: " + JSON.stringify(data)) ;
l_deferred.resolve(data);
}).
error(function(data, status, headers, config) {
console.log("DB_Services - Error: " + data) ;
l_deferred.reject(status);
});
return l_deferred.promise;
错误(Chrome控制台)显示为:Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:58275' is therefore not allowed access.
我的搜索结果(不确定它是否正确)Tomcat拒绝了请求,即使我包含了上面显示的标题详细信息。
我还发现可以告诉Tomcat允许请求,但不知道如何以及在何处配置它。
所以,我的问题是:
1)我的http请求是否正确措辞?
2)如何让Tomcat允许此请求?
提前感谢任何建议。
答案 0 :(得分:1)
您可以尝试在服务器端的java代码中添加过滤器类,示例代码
public class CorsFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
response.addHeader("Access-Control-Allow-Origin", "*");
if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
//Add CORS "pre-flight" request
response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
response.addHeader("Access-Control-Allow-Headers", "Authentication-token");
response.addHeader("Access-Control-Allow-Headers", "Content-Type");
response.addHeader("Access-Control-Max-Age", "3600");
}
filterChain.doFilter(request, response);
}
}
将其添加到web.xml
<filter>
<filter-name>cors</filter-name>
<filter-class>location.of.filter.class</filter-class>
</filter>
<filter-mapping>
<filter-name>cors</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
并在你的角度js app配置中尝试添加
app.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
}]);
这解决了我的问题,希望它也能帮到你。
答案 1 :(得分:0)
您正在遇到所谓的Same-Origin Policy。此策略背后的核心动机之一是防止您没有编写(因而不受信任)的脚本在页面上运行(并可能从中获取数据)。试图恶意行事的脚本正在执行所谓的Cross-Site Scripting。
为了不违反同源政策,您的网站只能要求提供以下脚本:
您会注意到这基本上只代表您的网站。
解决此限制的一种新方法是使用Cross-Origin Resource Sharing (CORS)。为此,您必须控制要运行的所有脚本的代码/服务器。
为了帮助您入门,我们已经有了很好的问题/答案:Ways to circumvent the same-origin policy