Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在Spring中的MultipartResolver之前调用侦听器_Spring_Spring Mvc - Fatal编程技术网

无法在Spring中的MultipartResolver之前调用侦听器

无法在Spring中的MultipartResolver之前调用侦听器,spring,spring-mvc,Spring,Spring Mvc,在我的spring-3应用程序中,我有一个AuthenticationInterceptor(基本上是一个拦截器),用于检查用户的权限。我正在使用Spring的多部分解析器尝试将文件上载到服务器。 我现在面临的问题是,如果出现MaxUploadSizeExceedeException,我希望根据用户权限执行不同的操作。 但是,我发现此异常发生在DispatcherServlet级别,并且被HandlerExceptionResolver 我想在这一切发生之前呼叫我的AuthenticationI

在我的spring-3应用程序中,我有一个AuthenticationInterceptor(基本上是一个拦截器),用于检查用户的权限。我正在使用Spring的
多部分解析器
尝试将文件上载到服务器。 我现在面临的问题是,如果出现
MaxUploadSizeExceedeException
,我希望根据用户权限执行不同的操作。 但是,我发现此异常发生在DispatcherServlet级别,并且被
HandlerExceptionResolver
我想在这一切发生之前呼叫我的AuthenticationInterceptor?
有直截了当的方法吗

问题在于,异常发生在请求被分派到控制器之前,因此,您的拦截器也不会触发。我猜你已经猜出了那个部分

想绕过那个

首先,我将使用servlet过滤器将身份验证机制移到servlet前面。话虽如此,如果像Spring Security这样的优秀产品可以为您提供解决方案,那么在该领域推出您自己的解决方案几乎没有意义

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

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


希望有帮助

在调用处理程序代码之前,有两种基本方法来处理流中的操作:

  • 实现
    HandlerInterceptor
    接口,并在
    preHandle
    方法中对要运行的代码进行编码
  • 使用
    @Aspect
    创建Aspect,并在方法调用之前配置切入点以运行

  • 在这两种情况下,您都可以使用
    SecurityContextHolder.getContext().getAuthentication().getAuthority()
    检查登录用户的角色,然后根据角色成员身份决定要做什么。

    但我已经有了身份验证机制,现在不想更改它。另外,我很好奇这些组件的调用顺序。当你说异常发生在请求被发送到控制器之前,正因为如此,你的拦截器也从不触发。我很好奇为什么会这样。有一种叫做“过滤模式”的通用模式,它涉及请求的预处理。Servlet过滤器是该模式的一个实现。SpringMVC的拦截器是相同模式的另一个实现。区别在于它们在何处拦截/预处理请求。servlet过滤器在请求到达servlet之前对请求进行预处理(在本例中,是SpringMVC的DispatcherServlet)。但是,拦截器在DispatcherServlet将请求发送到您的一个控制器之前对请求执行预处理。为了满足您的需求,您需要在请求到达DispatcherServlet之前拦截/预处理请求。这意味着使用一个servlet过滤器,正如我所指出的,已经有一个非常好的安全性实现,它基于Spring安全性。如果您想继续使用AuthInterceptor,您将获得更多的功能,但您希望实现的目标无法通过这种方法实现。总的来说,我认为你最好使用一个100万年前就已经测试过的经验证的解决方案,而不是使用你自己的解决方案。基于这个解决方案,我也相信我使用的是Spring的SrpingSecurity模块?否-HandlerInterceptor是可用的,无论你是否使用Spring Security