欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(七)SpringMVC拦截器

程序员文章站 2022-07-09 18:05:06
...

   SpringMVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理,我们可以自定义一些拦截器来实现特定的功能,两者之间的区别在于:

  • 过滤器是 Servlet 规范中的一部分,适用于任何 Java Web 工程;拦截器只适用于 SpringMVC框架。
  • 过滤器可以对配置的 url 路径下的所有要访问的资源进行拦截;拦截器只会拦截配置的 url 路径下访问的控制器方法,即不会对要访问的 jsp、html、css 等资源进行拦截。

1、拦截器的定义与配置

1.1 自定义拦截器:

   在 Springmvc 中,自定义拦截器要实现 HandlerInterceptor 接口,因为 Java 1.8 版本的原因,接口已经提供了默认实现,所以我们只需重写用到的方法即可。

public class MyInterceptor implements HandlerInterceptor {
   	/**
     * @return true,则往下执行;false,则进行拦截,不再往下执行。
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("...preHandle, 预处理...");
        // 此处可做页面跳转,例如,未登录时跳转到登录界面
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("...postHandle, 后处理...");
        // 此处可做页面跳转,例如,将公用的模型数据(比如菜单导航之类的)传到视图
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("...afterCompletion, 最终处理...");
    }
}
  • preHandle() :在进入Handler方法之前执行(控制器方法执行前),进行预处理,可以用于身份认证、身份授权。
  • postHandle() :进入Handler方法之后(控制器方法执行后),返回ModelAndView之前执行,可以看到该方法中有个 ModelAndView 的形参。
  • afterCompletion() :执行Handler方法完成之后执行,可以用于释放资源、统一异常处理,统一日志处理等。

   注意,在 preHandle() 和 postHandle() 中,都可以指定响应的界面,从而改变控制器方法返回的页面。

1.2 拦截器配置:

   Springmvc 中的拦截器是针对具体的映射器的,Springmvc 框架将配置的类似全局的拦截器注入到每个HandlerMapping中。

  • springmvc.xml
	<mvc:interceptors>
        <mvc:interceptor>
            <!-- 配置拦截路径 -->
            <mvc:mapping path="test/*"/>
            <!-- 配置拦截器对象 -->
            <bean class="com.lyj.Interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

2、运行测试

  • 控制器方法:
	@RequestMapping("interceptor")
    public String testInterceptor() throws Exception{
        System.out.println("...testInterceptor...");
        return "success";
    }
  • index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="test/interceptor">测试拦截器</a>
</body>
</html>	
  • success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>结果页面</title>
</head>
<body>
    <h3>运行成功</h3>
    <% System.out.println("success.jsp 页面执行"); %>
</body>
</html>
  • 运行结果:
    (七)SpringMVC拦截器

  • 控制台输出:
    (七)SpringMVC拦截器

3、多个拦截器

   当我们为某个路径配置了多个拦截器时, Springmvc 框架会根据拦截器的配置顺序来分别执行这些拦截器,如图:

(七)SpringMVC拦截器

  • 配置多个拦截器:
	<mvc:interceptors>
        <mvc:interceptor>
            <!-- 配置拦截路径 -->
            <mvc:mapping path="/test/*"/>
            <!-- 配置拦截器对象 -->
            <bean class="com.lyj.Interceptor.MyInterceptor"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <!-- 配置拦截路径 -->
            <mvc:mapping path="/test/*"/>
            <!-- 配置拦截器对象 -->
            <bean class="com.lyj.Interceptor.MyInterceptor2"/>
        </mvc:interceptor>
    </mvc:interceptors>
  • 执行顺序:
    (七)SpringMVC拦截器

参考链接:

相关标签: springmvc 拦截器