我想“全局”捕获运行时异常,现在听起来很愚蠢,但是让我解释一下。 我已经在所有需要授权使用的ejb上创建了一个拦截器,每次调用方法时都会调用该拦截器。
在这里查看代码:
@Secure
@Interceptor
public class SecurityInterceptor {
@EJB
private SessionManager sessionManager;
@AroundInvoke
private Object securityCheck(InvocationContext ctx) throws Exception {
System.out.println("hello");
List<UserGroup> allowedRoles = (List<UserGroup>) ctx.getContextData().get("rolesAllowed");
sessionManager.isAuthorized(allowedRoles);
return ctx.proceed();
}
}
现在,我不想在“命名Bean”中使用使用try and catch块的将这些安全豆之一使用的每种方法的主体包围起来,如下所示:
public List<Contracts> getContracts() {
List<Contracts> contracts = new ArrayList<>();
try {
contracts = contractEntityManager.getAll();
} catch (EJBTransactionRolledbackException e) {
Throwable throwable = ExceptionUtils.getRootCause(e);
if (throwable instanceof NotAuthenticatedException) {
System.out.println("Not Authenticated");
}
else if (throwable instanceof UnAuthorizedException) {
System.out.println("Not Authorized");
}
}
return contracts;
}
因此,有某种方法可以全局捕获运行时异常,如果用户未经身份验证,则将其重定向到登录页面,如果未经授权,则将用户重定向到错误页面。
也许我的设计通常很糟糕,我需要完全重新考虑这个想法。 请让我知道。
谢谢
答案 0 :(得分:1)
因此,最后,您要捕获异常的是Web层。这很简单:
如果您仅使用servlet,请为每个要处理的异常在web.xml中指定error-page
元素,例如如下:
<error-page>
<exception-type>fully.quallified.NotAuthenticatedException</exception-type>
<location>/where/to/redirect/eg/login</location>
</error-page>
您声明要全局处理的异常以及要处理的URL,它可以是servlet,JSP或任何其他资源。
JAX-RS与javax.ws.rs.ext.ExceptionMapper
提供了类似的机制:
@Provider
public class NotAuthenticatedExceptionMapper implements ExceptionMapper<NotAuthenticatedException> {
...
}