gpt4 book ai didi

java - ContainerRequestFilter 方法未被调用

转载 作者:太空宇宙 更新时间:2023-11-04 13:26:36 30 4
gpt4 key购买 nike

我刚刚开始学习如何编写 REST Web 服务代码,并且已经坚持了好几天了。我正在使用 Jersey 2 编写一个具有基于 header 的过滤功能的示例应用程序,并部署在 Tomee-plus 1.7.2 上。无论我如何尝试,ContainerRequestFilter 的 filter 方法都不会被调用。

// TestRequestFilter.java
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.PreMatching;
import javax.ws.rs.ext.Provider;

@Provider
@PreMatching
public class TestRequestFilter implements ContainerRequestFilter
{
private final static Logger log = Logger.getLogger(DemoRESTRequestFilter.class.getName());

@Override
public void filter(ContainerRequestContext requestCtx) throws IOException
{
System.out.println("FILTER-REQUEST");
}
}

我的web.xml文件是空的,保存了所需的 header 。现在的行为是:过滤器被识别为 @Provider 并正常实例化,我的测试 Web 服务(只是一个返回空响应的 GET)可以正常调用,但 filter 方法永远不会被调用。

我尝试过的事情及其效果:

  • 在扩展应用程序的类中声明过滤器:部署时出错。
  • 在扩展 ResourceConfig 的类中注册过滤器:过滤器被实例化两次,但 filter 方法仍然没有被调用。
  • 使用 com.sun.jersey.spi.container 包中的类:没有效果。
  • 向 WS 方法添加身份验证注释(@RolesAllowed、@PermitAll、...):无效。
  • disabled=true 添加到服务器配置中的 cfx-rs.properties:无法在常用 URL 中找到已部署的服务。
  • 将此添加到 web.xml:没有效果。

<servlet>
<servlet-name>CongressAppWS</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>org.glassfish.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.s4w.congressapp.auth.DemoRESTRequestFilter;com.s4w.congressapp.auth.DemoRESTResponseFilter</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.s4w.congressapp.auth;com.s4w.congressapp.resources</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

  • 在之前的代码中使用 com.sun.jersey.spi.container 前缀代替 org.glassfish.jersey.spi.container:没有效果。

老实说,我已经没有选择了。每次我尝试新的东西时,要么没有效果,要么一切都停止工作。有什么帮助吗?

最佳答案

我找到了一个真正有效的ContainerRequestFilter替代方案!它是javax.servlet.Filter。从这个类扩展,我所要做的就是用下面的代码注释它,过滤机制就像一个魅力。

@WebFilter(filterName = "AuthenticationFilter", urlPatterns = { "/*" })

关于java - ContainerRequestFilter 方法未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32588529/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com