我想在启用了cors的情况下使用Jax-R构建REST-API。所以我用谷歌搜索了怎么做并发现了这个:
解决方案是一个ResponseFilter,它为每个响应添加一些头信息,以便用户的浏览器知道,允许跨域访问。
因为我在执行任何请求时没有执行ResponseFilter(尝试过GET,POST和OPTIONS),我再次搜索并发现:
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" );
}
}
我继续使用Google搜索并发现,我忘记将过滤器添加到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>
我现在没有更多的想法,想问你,如果你可能有我的解决方案。提前谢谢!
答案 0 :(得分:1)
您正在使用Jersey 1(可以通过web.xml中的com.sun.jersey
来判断)。您正在使用(或向我们展示)的过滤器实现是泽西岛2.这有细微的差别,但这是一个主要的区别。后者不适用于泽西岛1号。
它甚至编译的事实(如果是这种情况)意味着你需要摆脱一些依赖。您拥有的类是JAX-RS 2类(接口)。您可能拥有的任何JAX-RS / Jersey 2依赖关系都可以摆脱它们。他们打得不好(也许不是问题的原因,但摆脱它们以避免任何混乱)
com.sun.jersey
(保留)org.glassfish.jersey
(摆脱)javax.ws.rs-api
(摆脱)