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-handler
,DefaultServletHttpRequestHandler
将处理请求。因此,如果此解决方案不起作用,请将其删除并查看(调试)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 安全启动错误