过滤@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。现在我可以创建一个EJBInterceptor
或SOAPHandler
来适当地编辑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类?
当我的会话创建策略设置为 STATELESS 时,为啥 Spring Security 的 SessionManagementFilter 会运行?