【发布时间】:2015-03-16 16:05:09
【问题描述】:
我想用 Jax-Rs 构建一个启用 cors 的 REST-API。所以我用谷歌搜索了怎么做,发现了这个:
解决方案是一个ResponseFilter,它在每个响应中添加一些头部信息,以便用户的浏览器知道,允许跨域访问。
因为当我执行任何请求(尝试 GET、POST 和 OPTIONS)时 ResponseFilter 没有被执行,我再次谷歌搜索并发现:
ContainerResponseFilter not working
@lefloh 给出了一个很好的答案,这听起来很合乎逻辑(删除注释@PreMatching)。它这样做了,但是当我执行 Http-Request 时,我的过滤器没有被调用。
这是我的代码:
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
@Provider
public class RESTServiceResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext parContainerRequestContext, ContainerResponseContext parContainerResponseContext) throws IOException {
parContainerResponseContext.getHeaders().add( "Access-Control-Allow-Origin", "*" );
parContainerResponseContext.getHeaders().add( "Access-Control-Allow-Credentials", "true" );
parContainerResponseContext.getHeaders().add( "Access-Control-Allow-Methods", "GET, POST, DELETE, PUT" );
parContainerResponseContext.getHeaders().add( "Access-Control-Allow-Headers", "Content-Type" );
}
}
我一直在谷歌搜索,发现我忘记将过滤器添加到 web.xml。所以我也这样做了:
<servlet>
<display-name>webinterface.api</display-name>
<servlet-name>JAX-RS REST Servlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>de.tsystems.lbus.apprestserver</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
<param-value>de.apprestserver.filter.RESTServiceResponseFilter</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JAX-RS REST Servlet</servlet-name>
<url-pattern>/TNR/*</url-pattern>
</servlet-mapping>
我现在没有更多的想法,想问你,如果你对我有解决方案。提前致谢!
【问题讨论】: