14-SpringMVC拦截器

2022-10-27 13:16:52 浏览数 (3)

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>

访问控制器业务方法

控制台输出

0 人点赞