1

我已经AuthenticationFailureListener通过使用实现了登录失败,ApplicationListener<AuthenticationFailureBadCredentialsEvent>并且我所有的 Bad Credentials 事件都在同一个类中处理,非常方便,我尝试添加一个侦听器,ExpiredJwtException或者SignatureException但我无法确定触发了哪个事件,我尝试过 -

@Component
public class ApplicationEventListener implements ApplicationListener<ApplicationEvent>{

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println(event.toString()); //not printed when ExpiredJwtException thrown
    }
}

捕获所有ApplicationEvent,但当此异常之一发生时,该方法onApplicationEvent不会被触发。我可以捕捉到这个异常,但我想像处理一样全局处理BadCredentialsException它们AuthenticationFailureBadCredentialsEvent。试过AuthenticationFailureExpiredEvent-

@Component
public class ApplicationEventListener implements ApplicationListener<AuthenticationFailureExpiredEvent>{

    @Override
    public void onApplicationEvent(AuthenticationFailureExpiredEvent event) {
        System.out.println("Expired!!"); //same result
    }
}

但仍然无法正常工作。

4

2 回答 2

0

我认为发布ApplicationEvent捕获异常时最简单的方法是使用ApplicationEventPublisher. 无需ApplicationEvent使用此方法来实现,因为它将任何对象包装成PayloadApplicationEvent您可以在您的中使用ApplicationEventListener并对其进行操作的对象。这适用于 Spring 4.2,这是官方链接:https ://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2

于 2018-11-05T15:55:37.753 回答
0

我不确定这一点,我必须检查源,但是:可能是应用程序事件没有为or发出ExpiredJwtExceptionSignatureException

可能的解决方案是:

  1. 自己发布事件:正如您提到的,您能够捕获这些异常,因此一个简单的解决方案是捕获它们然后发出所需的事件。您只需要自动装配ApplicationEventPublisher然后调用publishEvent(event).

  2. 使用 aFilter在一个地方捕获和处理异常。

解决方案 2 的示例:

public class AuthFailureFilter extends GenericFilterBean {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        try {
            chain.doFilter(request, response);
        } catch (ExpiredJwtException | SignatureException exception) {
            handle(exception);
        }
    }
}
于 2018-11-05T15:58:07.223 回答