文章目录
  1. 1. 关于404
    1. 1.1. Springmvc中的基本流程
    2. 1.2. springmvc的404

关于404

Springmvc中的基本流程

SpringMVC从浏览器发送请求,到服务器响应数据,一共会经过哪些步骤:

  1. 浏览器发送请求到前端控制器 DispatherServlet
  2. 前端控制器将请求消息转发给处理器映射器 HandlerMapping
  3. 处理器映射器将请求消息中的路径根据其映射关系,找到需要执行的Controller方法信息,并返回给前端控制器返回途中经过拦截器(拦截器根据方法拦截,经处理器映射器处理后已确定需要执行的方法信息)
  4. 前端控制器将执行方法的映射信息发送给处理器适配器HandlerAdapter
  5. 处理器适配器根据方法信息,发送给处理器Handler,找到对应的Controller方法并执行
  6. Handler执行完返回一个ModelAndView对象给处理器适配器
  7. 处理器适配器将ModelAndView对象返回给前端控制器
  8. 前端控制器将ModelAndView对象发送给视图解析器ViewResolver
  9. 视图解析器将ModelAndView对象解析,返回一个View对象给前端控制器
  10. 前端控制器将Model中的数据填充到View中,得到一个具体的页面
  11. 前端控制器将页面视图响应给浏览器

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
2
3
4
5
6
7
@Override
protected DispatcherServlet createDispatcherServlet(WebApplicationContext servletAppContext) {
final DispatcherServlet dispatcherServlet = (DispatcherServlet) super.createDispatcherServlet(servletAppContext);
//设置抛出NoHandlerFoundException异常
dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
return dispatcherServlet;
}

2)同时在@ControllerAdvice中添加方法:

1
2
3
4
5
@ExceptionHandler
public ResponseEntity<String> handleResourceNotFoundException(NoHandlerFoundException nhre) {
logger.error(nhre.getMessage(), nhre);
return new ResponseEntity<String>("Not Found", HttpStatus.NOT_FOUND);
}

我们可以配置Spring在没有对应的@RequestMapping时,不要自行处理,让他抛出一个NoHandlerFoundException的异常,从而让我们配置的@ControllerAdvice进行统一处理

如果是xml风格的配置,可以在DispatcherServlet对应的配置文件中配置

如果是之前介绍的class风格的配置,可以这样配置:

1
dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);//for NoHandlerFoundException

实现方式1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 设置抛出NoHandlerFound异常,即404-->
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

参考: https://www.cnblogs.com/yangchongxing/p/9271900.html

文章目录
  1. 1. 关于404
    1. 1.1. Springmvc中的基本流程
    2. 1.2. springmvc的404