SpringMVC拦截器

  1. 1. 1、创建SpringMVC拦截器
  2. 2. 2、配置SpringMVC拦截器
  3. 3. 3、测试
    1. 3.1. 测试结果:

​ 早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足、可扩展性降低。

Spring将预处理与后处理功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于系统的解耦。SpringMVC的拦截器类似于Servlet中的过滤器Filter,用于对处理器进行预处理和后处理。

1、创建SpringMVC拦截器

创建 SpringMVC 拦截器,只需要实现 HandlerInterceptor 接口即可。 接口中有三个方法需要实现:

  1. preHandle:该方法在 controller 执行前执行,可以实现对数据的预处理。 如果方法返回 true ,则继续调用下一个资源。如果返回为False,则Handle本身及postHandle/afterCompletion以及后续的拦截器全部都不会再继续执行。
  2. postHandle:该方法在处理器执行后,生成视图前执行。这里有机会修改视图层数据。
  3. afterCompletion:Handle执行且视图渲染完成后执行 。最后执行,通常用于记录日志,释放资源,处理异常。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.lan.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyHandlerInterceptor1 implements HandlerInterceptor{
public boolean preHandle(HttpServletRequest request, HttpServletResponse
response, Object handler) {
System.out.println("preHandle running...");
return false;
}
public void postHandle(HttpServletRequest request, HttpServletResponse
response, Object handler, ModelAndView modelAndView) {
System.out.println("postHandle running...");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse
response, Object handler, Exception ex) {
System.out.println("afterCompletion running...");
}

}

2、配置SpringMVC拦截器

1
2
3
4
5
6
7
<!-- 可以配置多个拦截器 -->  
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.neusoft.springmvc.interceptor.CorsInterceptor" />
</mvc:interceptor>
</mvc:interceptors>

3、测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.lan.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class TestController {

@RequestMapping("/quick23")
@ResponseBody
public ModelAndView quickMethod23() {
System.out.println("目标方法执行....");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("name","9999999999");
modelAndView.setViewName("index.jsp");
return modelAndView;
}
}

测试结果:

1
2
3
4
preHandle running...
目标方法执行....
postHandle running...
afterCompletion running...

(如果preHandle方法返回值为false,则目标方法不会再执行)