对 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
而不是 Response
。 Request
是从客户端到服务器的数据,而Response
是从服务器到客户端的数据。标头需要由服务器设置,以告知浏览器该资源是否允许(或不允许)被特定域访问。
在您的示例中,您将在 servlet 调度之前将标头添加到响应中。您也不需要 javascript 请求中的标头。
这是一个很好的资源,其中包含有关不同标题和用例的更多详细信息。 http://www.html5rocks.com/en/tutorials/cors/
【讨论】:
以上是关于对 Glassfish 4 服务器的 Javascript 跨域请求?的主要内容,如果未能解决你的问题,请参考以下文章
Glassfish服务器不在IntelliJ IDEA Ultimate 2017.3.4的列表中
Glassfish 4.1.2 JVM无法启动退出代码127