Spring MVC Spring安全性和错误处理

Zem*_*ela 14 rest spring spring-security

我正在使用ResponseEntityExceptionHandler来全局处理错误并且几乎正常工作,除了我想用spring处理错误的请求.通过任何逻辑覆盖handleNoSuchRequestHandlingMethod应该处理这个,但是处理总是得到

HTTP状态404 -

类型状态报告

信息

description请求的资源不可用.

Apache Tomcat/7.0.37

我在控制台中启用debuging时得到了这个:

警告:org.springframework.web.servlet.PageNotFound - 找不到带URI的HTTP请求的映射

只是为了通过处理澄清我的意思是我正在返回JSON.

任何想法如何处理这个?

Jak*_*tka 21

原因是在那里,在DispatcherServlet类; 它发送错误响应而不必费心调用异常处理程序(默认情况下).

由于4.0.0.RELEASE这种行为可以简单地改变与throwExceptionIfNoHandlerFound参数:

设置是否在未找到此请求的Handler时抛出NoHandlerFoundException.然后可以使用HandlerExceptionResolver或@ExceptionHandler控制器方法捕获此异常.

XML配置:

<servlet>
    <servlet-name>rest-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>throwExceptionIfNoHandlerFound</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>
Run Code Online (Sandbox Code Playgroud)

基于Java的配置:

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    void customizeRegistration(ServletRegistration.Dynamic registration) {
        registration.setInitParameter("throwExceptionIfNoHandlerFound", "true");
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后NoHandlerFoundException可以像这样处理:

@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @Override
    ResponseEntity handleNoHandlerFoundException(NoHandlerFoundException ex,
            HttpHeaders headers, HttpStatus status, WebRequest request) {
        // return whatever you want
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 别忘了停用(或从未启用)``configureDefaultServletHandling``在你拥有的任何类``延伸WebMvcConfigurerAdapter``或异常不会被抛出未映射的URL,因此不能用这种方法捕获.从技术上讲,如果您启用此设置,我认为所有URL都由/**有效映射. (3认同)