ContainerResponseFilter 未执行
ContainerResponseFilter not executed
我想用 Jax-Rs 构建一个 REST-API 并启用 cors。所以我用谷歌搜索了怎么做并找到了这个:
解决方案是 ResponseFilter,它向每个响应添加一些 header 信息,以便用户的浏览器知道允许跨域访问。
因为当我发出任何请求(尝试 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>
我现在没有更多的想法,想问问你,你是否可以为我提供解决方案。提前致谢!
您正在使用 Jersey 1(可以通过 web.xml 中的 com.sun.jersey
判断)。您正在使用(或向我们展示)的过滤器实现是 Jersey 2。存在细微差别,但这是一个主要区别。后者不适用于 Jersey 1。
而且它甚至可以编译(如果是这样的话)这一事实意味着您需要摆脱一些依赖性。您拥有的 class 是 JAX-RS 2 class(接口)。任何 JAX-RS/Jersey 2 依赖项,你可能有,摆脱它们。他们玩得不好(也许不是问题的原因,但摆脱他们以消除任何混乱)
- 球衣 1 ==
com.sun.jersey
(保持)
- 球衣2 ==
org.glassfish.jersey
(去掉)
- JAX-RS 2 api ==
javax.ws.rs-api
(去掉)
See here for Jersey 1 implementation and configuration
我想用 Jax-Rs 构建一个 REST-API 并启用 cors。所以我用谷歌搜索了怎么做并找到了这个:
解决方案是 ResponseFilter,它向每个响应添加一些 header 信息,以便用户的浏览器知道允许跨域访问。
因为当我发出任何请求(尝试 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>
我现在没有更多的想法,想问问你,你是否可以为我提供解决方案。提前致谢!
您正在使用 Jersey 1(可以通过 web.xml 中的 com.sun.jersey
判断)。您正在使用(或向我们展示)的过滤器实现是 Jersey 2。存在细微差别,但这是一个主要区别。后者不适用于 Jersey 1。
而且它甚至可以编译(如果是这样的话)这一事实意味着您需要摆脱一些依赖性。您拥有的 class 是 JAX-RS 2 class(接口)。任何 JAX-RS/Jersey 2 依赖项,你可能有,摆脱它们。他们玩得不好(也许不是问题的原因,但摆脱他们以消除任何混乱)
- 球衣 1 ==
com.sun.jersey
(保持) - 球衣2 ==
org.glassfish.jersey
(去掉) - JAX-RS 2 api ==
javax.ws.rs-api
(去掉)
See here for Jersey 1 implementation and configuration