无法在Spring中的MultipartResolver之前调用拦截器

时间:2012-05-18 12:06:14

标签: spring spring-mvc

在我的spring-3应用程序中,我有一个AuthenticationInterceptor(基本上是一个拦截器),它检查用户的权限。我正在使用Spring的MultipartResolver来尝试将文件上传到服务器。 我现在面临的问题是,如果是MaxUploadSizeExceededException,我希望根据用户权限执行不同的操作。 但是我发现此异常发生在DispatcherServlet级别并被HandlerExceptionResolver捕获 我希望能够在任何这种情况发生之前调用我的AuthenticationInterceptor吗? 有一种直截了当的方式。

2 个答案:

答案 0 :(得分:1)

问题是异常发生在将请求分派给控制器之前,因此,拦截器也永远不会触发。我猜你已经找到了那个部分。

想要解决这个问题......

对于初学者,我会使用servlet过滤器将身份验证机制移出servlet的前端。这就是说,当一个像Spring Security这样的优秀产品可以为你做到这一点时,在这个领域推出自己的解决方案几乎没有意义。

一旦转换到Spring Security(或类似版本),用户的SecurityContext(角色,权限等)将在异常发生时被解决并被捕获。

现在,如果我正确地阅读您的问题,似乎您可能希望根据用户的角色,权限等以不同方式响应异常。此时此应该是可能的。您将实现一个自定义HandlerExceptionResolver,它检查SecurityContext以查看用户是否具有某个角色或权限,然后相应地做出响应。

希望有所帮助!

答案 1 :(得分:0)

在调用Handler代码之前,有两种基本方法可以处理内部操作:

  1. 实施HandlerInterceptor界面,并使用preHandle方法
  2. 对要运行的代码进行编码
  3. 使用@Aspect创建一个方面并配置切入点以运行@Before方法调用
  4. 在任何一种情况下,您都可以使用SecurityContextHolder.getContext().getAuthentication().getAuthorities()检查登录用户的角色,然后根据角色成员身份决定要执行的操作。