Javascript 跨域请求到 Glassfish 4 服务器?

标签 java javascript servlets glassfish cors

我有一个带有 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/

相关文章:

javascript - 如何限制对 Netlify Serverless 功能的访问

java - 如何使用 request.setAttribute() 通过单击链接来设置和传递值

java - 带有克隆项目 : build problems 的 Tomcat + Eclipse

java - io.netty.util.IllegalReferenceCountException : refCnt: 0 in Netty

javascript - 网站有什么方法可以区分 Microsoft Edge 和 Google Chrome 的渲染引擎吗?

java - Spring JSR 303验证在编辑/添加时访问其他字段值

javascript - javaScript中如何将字符串转换为对象

java - 如何获取已在 Java Servlet 上下文中设置的全局对象

java - 我的 disposeSplashScene 中出现奇怪的警告

JavaFx:使用webengine在服务器程序中获取javascript渲染的dom