对 Glassfish 4 服务器的 Javascript 跨域请求?

Posted

技术标签:

【中文标题】对 Glassfish 4 服务器的 Javascript 跨域请求?【英文标题】:Javascript cross-domain requests to a Glassfish 4 server? 【发布时间】:2014-07-19 22:36:43 【问题描述】:

我有一个带有 servlet 的 Glassfish 4 网络服务器(在本地 atm 运行以进行测试),需要能够使用 javascript 从不同域请求字符串。

在寻找解决方案时,人们建议通过创建过滤器类(实现 ContainerRequestFilter 和 ContainerResponseFilter)在我的 Web 服务器上启用 CORS。 我试过创建这样一个类,但客户端仍然得到同样的错误; “请求的资源上没有 'Access-Control-Allow-Origin' 标头”。

我做错了什么?

代码:

类: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 请求。但我仍然想了解我之前的尝试有什么问题......

【问题讨论】:

【参考方案1】:

您正在将标头添加到 Request 而不是 ResponseRequest 是从客户端到服务器的数据,而Response 是从服务器到客户端的数据。标头需要由服务器设置,以告知浏览器该资源是否允许(或不允许)被特定域访问。

在您的示例中,您将在 servlet 调度之前将标头添加到响应中。您也不需要 javascript 请求中的标头。

这是一个很好的资源,其中包含有关不同标题和用例的更多详细信息。 http://www.html5rocks.com/en/tutorials/cors/

【讨论】:

以上是关于对 Glassfish 4 服务器的 Javascript 跨域请求?的主要内容,如果未能解决你的问题,请参考以下文章

Glassfish 4 服务器意外停止

Glassfish服务器不在IntelliJ IDEA Ultimate 2017.3.4的列表中

Glassfish 4.1.2 JVM无法启动退出代码127

使用Windows 10在Eclipse ee上的Glassfish 4的位置

在本地主机上的 glassfish 4.0 上实现 ssl

Glassfish 4.1 + Hibernate 5.2 连接