SpringMVC拦截器(Interceptor)
SpringMVC中的拦截器作用类似Servlet中的Filter,用于对处理器进行预处理与后处理
将拦截器按一定顺序连成一条链,这条链被称为拦截器链(Interceptor Chain),在访问被拦截的方法或字段时,拦截器链就会按照指定顺序执行,这也是AOP思想的体现
拦截器与过滤器的区别
区别 | 过滤器 | 拦截器 |
---|---|---|
使用范围 | 是servlet规范中的一部分,任何JavaWeb工程都可以使用 | 是SpringMVC框架所封装的,只有使用SpringMVC框架的工程才可以使用 |
拦截范围 | 在url-pattern中配置了/*的情况下,可以对所有访问资源进行过滤 | 只能拦截访问的控制器中的业务方法,如果访问的是.jsp.html.css.img等资源文件,是无法拦截的 |
拦截器基本操作
1. 创建拦截器类,实现HandlerInterceptor接口、
代码语言:javascript复制public class MyInterceptor implements HandlerInterceptor {
/**
* 在目标方法执行之前执行
* @return 返回值为布尔类型,表示是否拦截该方法,停止后续执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("在目标方法执行之前执行...");
return true;
}
/**
* 在目标方法执行完成之后,视图对象返回之前 执行
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("在目标方法执行完成之后,视图对象返回之前 执行...");
}
/**
* 在视图返回之后执行
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("在视图返回之后执行...");
}
}
2. 配置拦截器
代码语言:javascript复制<!--配置拦截器链-->
<mvc:interceptors>
<mvc:interceptor>
<!--path指定对哪些资源进行拦截(只能拦截控制器中的业务方法)-->
<mvc:mapping path="/**"/>
<bean class="cn.ywrby.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
3. 测试拦截器效果
控制器实现
代码语言:javascript复制@Controller
public class TargetController {
@RequestMapping("/show")
public ModelAndView show(){
System.out.println("目标资源执行");
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("username","Leslie");
modelAndView.setViewName("index");
return modelAndView;
}
}
jsp页面实现
代码语言:javascript复制<%--
Created by IntelliJ IDEA.
User: renboyu010214
Date: 2021/3/14
Time: 12:54
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Hello world!${username}</h1>
</body>
</html>
访问控制器业务方法
控制台输出