GlassFish:如何设置Access-Control-Allow-Origin标头

时间:2012-04-27 02:09:07

标签: glassfish java-ee-6 glassfish-3

我使用的是最新版本的GlassFish。我想在响应中设置Access-Control-Allow-Origin标头,以便可以从任何域调用我在GlassFish上托管的API。但我无法找到设置它的位置。

4 个答案:

答案 0 :(得分:16)

在我的情况下,API请求由Jersey专门处理,因此我可以在ContainerResponseFilter中设置响应标头:

package my.app;

import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;

public class CrossOriginResourceSharingFilter implements ContainerResponseFilter {

    @Override
    public ContainerResponse filter(ContainerRequest creq, ContainerResponse cresp) {

        cresp.getHttpHeaders().putSingle("Access-Control-Allow-Origin", "*");
        cresp.getHttpHeaders().putSingle("Access-Control-Allow-Credentials", "true");
        cresp.getHttpHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        cresp.getHttpHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept");

        return cresp;
    }
}

在web.xml中启用过滤器:

<servlet>
    <servlet-name>Gateway Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
        <param-value>my.app.CrossOriginResourceSharingFilter</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

如果你不使用Jersey,我想你可以创建一个类似的servlet响应过滤器。

答案 1 :(得分:9)

执行此操作的最佳和最简单方法是右键单击项目

Create new in project

并选择跨源资源共享过滤器

Create new Cross-origin filter

答案 2 :(得分:2)

这是一种Java EE标准方法。除了使用的库包(javax)和获取头文件的方法调用不同(getHeaders)之外,它与Jersey示例几乎完全相同。

import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;

@Provider
public class RestResponseFilter implements ContainerResponseFilter{

@Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException{
        responseContext.getHeaders().putSingle("Access-Control-Allow-Origin", "*");
        responseContext.getHeaders().putSingle("Access-Control-Allow-Credentials", "true");
        responseContext.getHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        responseContext.getHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept");
    }

}

答案 3 :(得分:2)

由于您使用标签java-ee-6,我认为不支持@Provider。我使用以下代码,基于javaee6 tutorial

$(function(){
   $('div.elem div').each(function(){
     alert($(this).attr('data'));
   });
});