过滤@Stateless @Webservice

时间:2016-06-21 18:30:38

标签: java soap filter servlet-filters

我试图在我的所有Web服务端点上过滤(javax.servlet.Filter)所有传入的SOAP请求。这些Web服务是从@Stateless EJB创建的,并使用Message Authentication over SSL

我的网络服务注释如

@WebService
@Stateless
public class WebServiceA {
   @EJB
   private MyEJB ejbRef;
   ...
   public Result getMethodA()...
}

我有一个自定义过滤器,存在于我的Glassfish的lib/目录和config/default-web.xml内,我将过滤器映射到<url-patter>/*</url-pattern>

public final class MyFilter implements Filter {

   @Override
   public void init()...

   @Override
   public void destroy()...

   @Override
   public void doFilter(...) {
      ...
      System.out.println("Got to Filter");
      ...
   }
}

除了我的SOAP端点之外,我对应用程序的每个请求都会调用过滤器。过滤器被点击到admin console,过滤器被点击到-war文件,过滤器在转到undeployed EAR时被点击...基本上除了已部署的SOAP端之外的所有内容点(永远不会点击我的WebServiceA -> getMethodA()终点。

我也尝试过实现SOAPHandler,但遗憾的是,在调用容器的身份验证方法(JAAS)之后处理这个问题,我必须在登录上下文之前更改SOAP标头。

我查看了这个链接Is it possible to define a servlet filter for a stateless ejb webservice, on GlassFish 3.1,但@RequestScoped不适用@Stateless @WebService,这是{ejb-jar

*编辑我尝试了EJBInterceptors,就像SOAPHandler一样,拦截器在容器管理安全性之后被调用。

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

过滤器与servlet技术一起使用。将它们与EJB / JAX WS一起使用将不会拦截请求。

你应该使用的是EJB拦截器,其目的与过滤器完全相同。

这是一个样本。

public class MyEJBInterceptor {

    @AroundInvoke
    public Object invoke(InvocationContext context) throws Exception  {

    //Your code goes here
    }

使用此拦截器:

@Stateless
@Interceptors({MyEJBInterceptor.class})
public class MyBean implements MyBeanLocal {

    enter code here

}

答案 1 :(得分:1)

除了编辑Payara的来源之外,我决定通过删除ws_security并停用Secure Service并将Message Authentication over SSL设置为<transport-guarantee>来禁用NONE {1}}这应该没问题,因为与Web服务器的通信仍然是https。现在我可以创建一个glassfish-ejb-jar.xmlEJBInterceptor来适当地编辑SOAP头,然后调用我的自定义领域的登录机制。感谢@ user2286167的指示。