我有一个带有 servlet 的 Glassfish 4 网络服务器(在本地 atm 上运行以进行测试),需要能够使用 Javascript 从不同的域请求字符串。
在寻找解决方案时,人们建议通过创建 Filter 类(实现 ContainerRequestFilter 和 ContainerResponseFilter)在我的 Web 服务器上启用 CORS。 我尝试过创建这样的类,但客户端仍然遇到相同的错误; “请求的资源上不存在‘Access-Control-Allow-Origin’ header ”。
我做错了什么?
代码:
类:CrossDomainFilter.java
package server;
import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
@Provider
@CORSBinding
public class CrossDomainFilter implements ContainerRequestFilter, ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext request) throws IOException {
System.out.println("filter(request) called !!");
request.getHeaders().add("Access-Control-Allow-Origin", "*");
request.getHeaders().add("Access-Control-Allow-Headers",
"Authorization");
if (request.getMethod().equals("OPTIONS")) {
System.out.println("OPTIONS is requested!!!!!!!!!!!!!");
}
if (request.getMethod().equals("GET")) {
System.out.println("GET is requested!!!!!!!!!!!!!");
}
if (request.getMethod().equals("POST")) {
System.out.println("POST is requested!!!!!!!!!!!!!");
}
if (request.getMethod().equals("DELETE")) {
System.out.println("DELETE is requested!!!!!!!!!!!!!");
}
if (request.getMethod().equals("PUT")) {
System.out.println("PUT is requested!!!!!!!!!!!!!");
}
}
@Override
public void filter(ContainerRequestContext arg0,
ContainerResponseContext arg1) throws IOException {
System.out.println("filter(request, response) called !!");
}
}
发出请求的 Javascript 函数 函数 httpRequest(url) {
var request = new XMLHttpRequest();
request.open("GET", url, false);
request.setRequestHeader('Access-Control-Allow-Origin', '*');
request.send(null);
return (request.status == 404) ? url + " not found!" : request.responseText;
}
编辑: 最终使用了这个:https://bitbucket.org/thetransactioncompany/cors-filter 我现在可以向我的服务器跨域发出 JavaScript 请求。但我仍然想了解我之前的尝试出了什么问题......
最佳答案
您正在向Request
而不是Response
添加 header 。 Request
是客户端到服务器的数据,而Response
是服务器到客户端的数据。服务器需要设置 header ,以告诉浏览器特定域允许(或不允许)访问该资源。
在您的示例中,您将在 servlet 分派(dispatch)之前将 header 添加到响应中。您也不需要 JavaScript 请求中的 header 。
这是一个非常好的资源,其中包含有关不同标题和用例的更多详细信息。 http://www.html5rocks.com/en/tutorials/cors/
关于Javascript 跨域请求到 Glassfish 4 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23949999/