过滤@Stateless @Webservice

Posted

技术标签:

【中文标题】过滤@Stateless @Webservice【英文标题】:Filter for @Stateless @Webservice 【发布时间】:2016-10-23 10:47:13 【问题描述】:

我正在尝试过滤 (javax.servlet.Filter) 我所有 Web 服务端点上的所有传入 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 一样,拦截器是在容器管理的安全性之后调用的。

感谢您的帮助

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案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


【讨论】:

谢谢,这听起来很有希望。我会尝试让一个示例工作,如果可以,我会接受。 拦截器确实被调用了,但直到调用 JAAS 之后,我才需要它。也许有一种方法来定义优先级/顺序? 它按照你在@拦截器中列出的顺序被调用 这只是其他自定义拦截器的顺序 Web 服务安全性和 JAAS 完全是两个不同的东西。您需要将您的安全代码包装到拦截器中。基本身份验证适用于 REST Web 服务。

以上是关于过滤@Stateless @Webservice的主要内容,如果未能解决你的问题,请参考以下文章

如何使用libpqxx中的pqxx :: stateless_cursor类?

.Net轻量状态机Stateless

当我的会话创建策略设置为 STATELESS 时,为啥 Spring Security 的 SessionManagementFilter 会运行?

keras lstm 区别 stateless 和 stateful

NancyFx 2.0的开源框架的使用-Stateless

[React] Creating a Stateless Functional Component