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不能在跳转页面了