SpringMVC拦截器

简述

SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。

可以自定义拦截器链,拦截器链就是将拦截器按照一定的顺序结成一条链,在访问被拦截的方法时拦截器链中的拦截器会按着定义的顺序进行。

拦截器和过滤器的区别:

  • 过滤器是servlet规范中的一部分,任何框架都可以使用过滤器技术
  • 拦截器是SpringMVC特有的
  • 过滤器配置了/*,可以拦截任何资源
  • 拦截器只会对控制器中的方法进行拦截

拦截器也是AOP思想的一种实现

自定义的拦截器需要实现HandlerInterceptor接口。

步骤:

新建一个Controller的控制器

 1 package zh.stu;
 2 
 3 
 4 import org.springframework.stereotype.Controller;
 5 import org.springframework.web.bind.annotation.RequestMapping;
 6 
 7 @Controller
 8 @RequestMapping("/person")
 9 public class PersonController {
10 
11     @RequestMapping(path = "/interceptor.do")
12     public String Interceptor(){
13         System.out.println("controller中的 方法");
14         return "successful";
15     }
16 }

创建类,实现HandlerInterceptor接口,重写需要的方法。方法中的解析见下。

 1 package zh.stu;
 2 
 3 import org.springframework.web.servlet.HandlerInterceptor;
 4 import org.springframework.web.servlet.ModelAndView;
 5 
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 
 9 public class MyInterceptor implements HandlerInterceptor {
10 
11 
12     /**
13      * 拦截controller中的方法
14      *放行了执行controller中的方法
15      *
16      *
17      *
18      * @param request
19      * @param response
20      * @param handler
21      * @return return true 》》方行
22      *          return false》》拦截
23      * @throws Exception
24      *
25      *
26      * 注意要在SpringMVC.xml文件中配置拦截器
27      */
28     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
29         System.out.println("拦截器中的方法执行");
30         return false;
31     }
32 
33     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
34         System.out.println("postHandler中的方法执行");
35         request.getRequestDispatcher("/index.jsp").forward(request,response);
36         return;
37     }
38 
39     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
40         System.out.println("afterCompletion中的方法执行");
41     }
42 }

在SpringMVC.xml文件中配置

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:mvc="http://www.springframework.org/schema/mvc"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 6        xsi:schemaLocation="
 7         http://www.springframework.org/schema/beans
 8         http://www.springframework.org/schema/beans/spring-beans.xsd
 9         http://www.springframework.org/schema/mvc
10         http://www.springframework.org/schema/mvc/spring-mvc.xsd
11         http://www.springframework.org/schema/context
12         http://www.springframework.org/schema/context/spring-context.xsd">
13 
14     <!--配置创建Spring容器创建的时候要扫描的包-->
15     <context:component-scan base-package="zh.stu"></context:component-scan>
16 
17     <!--配置试图解析器-->
18     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
19         <!--跳转的页面路径-->
20         <property name="prefix" value="/WEB-INF/pages/"/>
21         <!--跳转页面的后缀名称-->
22         <property name="suffix" value=".jsp"/>
23     </bean>
24     <!--配置静态资源不被拦截-->
25     <mvc:resources location="/css/" mapping="/css/**"/>  <!-- 样式 -->
26     <mvc:resources location="/images/" mapping="/images/**"/>  <!-- 图片 -->
27     <mvc:resources location="/js/" mapping="/js/**"/>  <!-- javascript -->
28 
29     <!--配置多个拦截器-->
30     <mvc:interceptors>
31         <!--配置拦截器-->
32         <mvc:interceptor>
33             <!--该拦截器拦截哪些个资源-->
34             <mvc:mapping path="/person/*"/>
35             <!--哪些资源不被拦截-->
36             <!--<mvc:exclude-mapping path=""/>-->
37             <!--配置拦截器的对象-->
38             <bean class="zh.stu.PersonController"/>
39         </mvc:interceptor>
40     </mvc:interceptors>
41     <!--配置Spring开启注解mvc的支持-->
42     <mvc:annotation-driven/>
43 </beans>

HandlerInterceptor接口中的方法

  • preHandle是Controller方法执行之前拦截的方法
    • 可以使用request或response跳转到指定的页面
    • return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
    • return false不放行,不会执行controller中的方法
  • postHandler是controller方法执行后执行的方法,在jsp是土执行前
    • 可以使用request或response跳转到指定的页面
    • 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示
  • afterCompletion方法是在jsp执行后执行
    • reques或response不能在跳转页面了
原文地址:https://www.cnblogs.com/LBJLAKERS/p/12322391.html