我正在尝试过滤(javax.servlet.Filter)所有web服务端点上的所有传入SOAP请求。这些web服务是从@Stateless EJB创建的,并使用Message Authentication over SSL
我的web服务的注释如下
@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一起工作,这是ejb- @WebService的一部分所需的
*编辑我尝试过EJBInterceptors,就像SOAPHandler一样,拦截器是在容器管理的安全性之后调用的。
谢谢你的帮助
发布于 2016-06-22 02:42:45
过滤器与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
}发布于 2016-06-22 21:32:20
除了编辑Payara的源代码之外,我决定通过删除Secure Service和禁用Message Authentication over SSL来禁用ws_security,并在我的glassfish-ejb-jar.xml中将<transport-guarantee>设置为NONE这应该没问题,因为与web服务器的通信仍然是https。现在,我可以创建一个EJBInterceptor或SOAPHandler来适当地编辑SOAP header,然后调用我的自定义领域的登录机制。感谢@user2286167的指导。
https://stackoverflow.com/questions/37952005
复制相似问题