【问题标题】:Replace EJBAccessException stacktrace logged by JBoss替换 JBoss 记录的 EJBAccessException 堆栈跟踪
【发布时间】:2016-05-14 02:20:20
【问题描述】:

我的应用程序中有一个受 EJB 安全保护的 REST 端点。

@Path("/somepath")
@Produces(MediaType.APPLICATION_JSON)
@Stateless
@SecurityDomain("mydomain")
@RolesAllowed({"user"})
public class MyResource extends AbstractResource

如果用户的会话超时,网络应用程序不知道,如果我尝试与之交互,它会得到 403 FORBIDDEN,这完全可以。但在服务器日志中,此错误如下所示:

14:47:52,682 ERROR [org.jboss.ejb3.invocation] (http--127.0.0.1-8080-5) JBAS014134: EJB Invocation failed on component MyResource for method public java.lang.String MyResource.getSupplies(): javax.ejb.EJBAccessException: JBAS014502: Invocation on method: public java.lang.String MyResource.getSupplies() of bean: MyResource is not allowed
        at org.jboss.as.ejb3.security.AuthorizationInterceptor.processInvocation(AuthorizationInterceptor.java:101) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
        at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.java:76) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
        at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:59) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
        at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final]
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
        at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:32) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
        at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final]
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
        at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
        at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:165) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final]
        at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:173) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final]
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
        at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
        at org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:72) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_55]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_55]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_55]
        at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_55]

这些消息太长了,太没用了。我想用“警告:未经授权的访问”之类的东西替换它们在日志中,也许还有一些额外的数据,但没有堆栈跟踪。我不知道该怎么做,因为这条消息是由 JBoss 记录的。 不胜感激,我如何才能达到预期的效果!

【问题讨论】:

  • 如果您使用 Logback 进行日志记录,您可以减少堆栈跟踪中的噪音。从 1.13 版本开始,它可以过滤堆栈跟踪(此功能仍未记录)。例如。 %m%n%rEx{full, org.jboss., sun.reflect. }
  • 嗨,你设法替换了堆栈跟踪吗?
  • 嗨@GustavoUlisesAriasMéndez。老实说,我不记得了。那是 3.5 年前,我多次换工作和项目。虽然我授予赏金的答案是有道理的 IMO

标签: java jboss7.x ejb-3.0 resteasy


【解决方案1】:

You should register an ExceptionMapper with RestEasy and do what you want in that handler.

ExceptionMapper 是自定义的、应用程序提供的组件,可以 捕获抛出的应用程序异常并编写特定的 HTTP 响应

你在web.xml注册他们:

<context-param>
        <param-name>resteasy.providers</param-name>
        <param-value>fully.qualified.package.to.your.CustomEJBAccessExceptionMapper</param-value>
</context-param>

【讨论】:

  • 很抱歉,但这不起作用,因为异常映射器在很久以后才发挥作用。在我的例子中,授权由 EJB 处理,并且发生在调用 RestEasy 方法之前。 ExceptionMapper 也是我首先想到的。
【解决方案2】:

我的研究表明,一种可能的解决方案是使用 Container Interceptors,它存在于 JBoss AS 的早期版本中,并在 JBoss AS 7.2 中再次出现。但是 7.1.1 中没有这样的东西,巧合的是我的 JBoss 版本。在我的老板决定我们应该迁移到 WildFly 之前,我会开放赏金以防万一有人有替代解决方案(不,我不会用补丁编译我自己的 JBoss AS)。

【讨论】:

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • 我是一名作家。不幸的是,这是迄今为止最有效的答案。除非有人为 JBoss 7.1.1 提出解决方案,否则我迟早会接受自己的答案。我不想让自己的问题没有答案,所以我发布了我唯一的答案。欢迎您提交另一个。
  • 正如我所承诺的,我接受了自己的答案。没有人提出可行的解决方案。大多数人甚至都没有尝试过忙于投票来关闭这个答案。仍然有一些时间留给任何想要奖励的人。
【解决方案3】:

我想在日志中用“警告:未经授权的访问”之类的内容替换它们,也许还有一些额外的数据

JBoss 支持自定义记录器。我不确定您是否可以配置它的日志记录以对每个类产生影响,但如果可能的话,调整您的日志记录(而不是拦截器等)是一种自然的方法。

【讨论】:

  • 这种方法有可能有助于删除堆栈跟踪。但是自定义消息呢?
  • 我不是 JBoss 专家,但我想如果你实现自定义记录器,你将能够将自定义消息写入日志
  • 我只剩下 18 分钟来分配奖励。这种做法是出乎意料的,但却是有权存在的。我认为它值得一些 RP。
  • 现代记录器库可以超越 System.out.println,不考虑它们的特性是不明智的。此外,您自己的问题是答案的一半:您说'我想在日志中替换它们......'。而且 - 谢谢:)
猜你喜欢
  • 2014-11-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2011-06-23
  • 2011-09-16
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
相关资源
最近更新 更多