Spring @ExceptionHandler不捕获AccessDeniedException

我有一个使用以下代码设置的exception处理程序

@ExceptionHandler(Throwable.class) public @ResponseBody CustomResponse handleException(Throwable throwable){ // handles exception, returns a JSON } 

我使用的是Spring Security 3.1。 当我尝试在没有身份validation的情况下执行操作时,应用程序会抛出AccessDeniedException。 它永远不会出现在这种方法中。 但与其他例外情况一起工作正常 这是应该工作的方式吗? 或者我的代码有问题吗?

这看起来像一个解决方案。 但如果我能在一个点上处理exception会更好。

这是我的配置文件

   //intercept urls          

UPDATE

这里用户未经过身份validation(ROLE_ANONYMOUS)。 当我尝试访问受保护的页面时,它会将我重定向到登录URL。 我的问题在于,我进行了一次AJAX调用。 因此,重定向到返回ModelAndView的方法不起作用。 这附近有工作吗?

在调度调度程序servlet之前,Spring Security的请求处理全部发生在filter链中,因此它对Spring MVCexception处理程序一无所知,实际上可以在没有Spring MVC的情况下使用它。

您所看到的是未经身份validation的用户的预期行为 ,但您不希望将Ajax调用重定向到UI代码。 很难确切地说出最佳解决方案是什么,因为对于未经身份validation的ajax调用,您不希望行为是什么。 例如,如果您希望它们仅使用403失败,那么您可以将ajax api分离为单独的filter链。 例如,如果你的ajax调用是/ajaxapi可以在现有的之前添加以下链定义:

     

然后,ajax调用只会获得403响应,直到用户通过浏览器界面进行身份validation。

我猜你在spring安全配置中定义了一个 。 此处理程序正在捕获AccessDeniedException 。 这可能就是为什么你没有在你的通用ExceptionHandler得到它。

有一个默认的AccessDeniedHandler(默认的弹簧安全设置)。 请阅读此内容以了解更多详情。