Spring MVC Spring 安全性和错误处理

Posted

技术标签:

【中文标题】Spring MVC Spring 安全性和错误处理【英文标题】:Spring MVC Spring Security and Error Handling 【发布时间】:2013-08-21 18:00:31 【问题描述】:

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

HTTP 状态 404 -

类型状态报告

消息

说明请求的资源不是 可用。

阿帕奇 Tomcat/7.0.37

我刚刚在控制台中启用调试时得到了这个:

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

只是为了澄清我的意思是我正在返回 JSON。

知道如何处理吗?

【问题讨论】:

【参考方案1】:

throwExceptionIfNoHandlerFound 仅考虑no handlers for request found。

如果配置了default-servlet-handlerDefaultServletHttpRequestHandler 将处理请求。因此,如果此解决方案不起作用,请将其删除并查看(调试)DispatcherServlet 这个地方。

【讨论】:

【参考方案2】:

原因是right there,在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>

基于Java的配置:

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer 

    void customizeRegistration(ServletRegistration.Dynamic registration) 
        registration.setInitParameter("throwExceptionIfNoHandlerFound", "true");
    
    ...

那么NoHandlerFoundException可以这样处理:

@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler 

    @Override
    ResponseEntity handleNoHandlerFoundException(NoHandlerFoundException ex,
            HttpHeaders headers, HttpStatus status, WebRequest request) 
        // return whatever you want
    

【讨论】:

请记住在您拥有extends WebMvcConfigurerAdapter 的任何类中禁用(或永远不要启用)configureDefaultServletHandling,否则将永远不会为未映射的 URL 抛出异常,因此永远不会被此方法捕获。从技术上讲,如果您启用此设置,我认为所有 URL 都由 /** 有效映射。 有人可以给我一些线索/提示,说明为什么“基于 Java 的配置”不是“XML 配置”起作用的原因

以上是关于Spring MVC Spring 安全性和错误处理的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + Spring Boot 安全启动错误

Spring MVC - 02 RequestMapping映射请求

Spring MVC Controller异常处理总结

Spring 3 MVC + 安全性

spring mvc 是啥

spring mvc配置文件出现红叉