我使用的是最新版本的GlassFish。我想在响应中设置Access-Control-Allow-Origin标头,以便可以从任何域调用我在GlassFish上托管的API。但我无法找到设置它的位置。
答案 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)
答案 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'));
});
});