我试图在我的所有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一样,拦截器在容器管理安全性之后被调用。
感谢您的帮助
答案 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.xml
或EJBInterceptor
来适当地编辑SOAP头,然后调用我的自定义领域的登录机制。感谢@ user2286167的指示。