2012-04-27 131 views

回答

15

在我的情况下,API请求完全由泽西处理,因此我可以在ContainerResponseFilter设置响应头:

<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> 

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中启用如果你不使用Jersey,我想你可以创建一个类似的servlet响应过滤器。

+0

可以添加一个例子如何在没有球衣的情况下做到这一点? – Berty 2012-07-02 14:58:42

+1

http://padcom13.blogspot.de/2011/09/cors-filter-for-java-applications.html – Hank 2012-07-04 09:56:59

+0

那么,对于CXF方法中描述的方法不起作用,因为来自jax-rs 2.0 API的ContainerRequestFilter确实不从Filter过滤器扩展/实现,因此不能配置为servlet过滤器。试图这样做会导致类抛出异常。 – 2013-05-22 20:51:31

2

这是一个Java EE标准的方式来做到这一点。它与Jersey示例几乎完全相同,只是使用的库包(javax)和获取标头的方法调用不同(getHeaders)。

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"); 
    } 

} 
+0

glassfish 4.1中的web.xml如何? – Muka 2015-07-08 01:56:59

1

由于您使用标签java-ee-6,我相信@Provider不受支持。我用下面的代码的基础上,javaee6 tutorial

import java.io.IOException; 
import java.util.logging.Logger; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.annotation.WebFilter; 
import javax.servlet.http.HttpServletResponse; 

@WebFilter(filterName = "AddHeaderFilter", urlPatterns = {"/*"}) 
public class ResponseFilter implements Filter { 

    private final static Logger log = Logger.getLogger(ResponseFilter.class.getName()); 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    if (response instanceof HttpServletResponse) { 
     log.info("Adding headers"); 
     HttpServletResponse http = (HttpServletResponse) response; 
     http.addHeader("Access-Control-Allow-Origin", "*"); 
     http.addHeader("Access-Control-Allow-Credentials", "true"); 
     http.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); 
    } 
    chain.doFilter(request, response); 
} 
6

这样做的最好的,最简单的方法,就是在项目右键单击

Create new in project

,并选择跨来源资源共享过滤

Create new Cross-origin filter

+0

如果条目不在上下文菜单中,请选择“Other ...”,然后通过键入“cross”来过滤选项列表。从现在起,您可以按照莱昂纳多描述的上下文菜单访问它。 – 2017-02-02 15:17:06

+0

这个!!!我不知道为什么这不是更经常提及。像魅力一样工作,只需要1秒 – Rombus 2017-07-13 20:33:19