Springmvc中的404
更新日期:
关于404
Springmvc中的基本流程
SpringMVC从浏览器发送请求,到服务器响应数据,一共会经过哪些步骤:
- 浏览器发送请求到前端控制器 DispatherServlet
- 前端控制器将请求消息转发给处理器映射器 HandlerMapping
- 处理器映射器将请求消息中的路径根据其映射关系,找到需要执行的Controller方法信息,并返回给前端控制器返回途中经过拦截器(拦截器根据方法拦截,经处理器映射器处理后已确定需要执行的方法信息)
- 前端控制器将执行方法的映射信息发送给处理器适配器HandlerAdapter
- 处理器适配器根据方法信息,发送给处理器Handler,找到对应的Controller方法并执行
- Handler执行完返回一个ModelAndView对象给处理器适配器
- 处理器适配器将ModelAndView对象返回给前端控制器
- 前端控制器将ModelAndView对象发送给视图解析器ViewResolver
- 视图解析器将ModelAndView对象解析,返回一个View对象给前端控制器
- 前端控制器将Model中的数据填充到View中,得到一个具体的页面
- 前端控制器将页面视图响应给浏览器
springmvc的404
1)如 404 等是通过 Servlet (DispatcherServlet.noHandlerFound) 的处理并返回 response ( response.sendError) ,并未到达 Controller 层,所以并不能捕获到。
2)如果是用户请求了一个不存在的页面,没有对应的@RequestMapping,此时Spring的DispatcherServlet就会处理掉返回404,不会进入任何一个controller
3)还有比如spring security之类的权限管理模块,如果用户的密码正确,但是该账户的权限组没有权限访问当前页面,此时权限模块会有自己的AccessDeniedHandler处理,也不会进入配置的@ControllerAdvice
如果采用spring boot 或者AppInitializer来配置,需要在AppInitializer的实现类中重写createDispatcherServlet方法:
1)设置抛出NoHandlerFoundException异常
1 | @Override |
2)同时在@ControllerAdvice中添加方法:
1 | @ExceptionHandler |
我们可以配置Spring在没有对应的@RequestMapping时,不要自行处理,让他抛出一个NoHandlerFoundException的异常,从而让我们配置的@ControllerAdvice进行统一处理
如果是xml风格的配置,可以在DispatcherServlet对应的配置文件中配置
如果是之前介绍的class风格的配置,可以这样配置:
1 | dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);//for NoHandlerFoundException |
实现方式1:
1 | <servlet> |