拦截器 HandlerInterceptor
1.在SpringMVC配置文件(springMVC.xml)中进行以下配置:
<mvc:interceptors>
<!-- 默认拦截所有请求 -->
<!-- 第一种方式 -->
<bean class="com.atguigu.interceptor.FirstInterceptor"></bean>
<bean class="com.atguigu.interceptor.SecondInterceptor"></bean>
<!--
第二种方式
此方式要求拦截器上必须加注解@Component
-->
<!-- <ref bean="firstInterceptor" /> -->
<!-- 设置自定义拦截方式 -->
<!-- <mvc:interceptor>
<bean></bean>
<mvc:mapping path=""/>
<mvc:exclude-mapping path=""/>
</mvc:interceptor> -->
</mvc:interceptors>
2.test.jsp
<a href="testInterceptor">测试拦截器</a>
3.TestInterceptorController.java(测试类)
package com.atguigu.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestInterceptorController {
/**
* 当有多个拦截器时,
* preHandle:按照拦截器数组正向顺序执行
* postHandle:按照拦截器数组反向顺序执行
* afterCompletion:按照拦截器数组反向顺序执行
*
* 当多个拦截器的preHandle有不同的值时
* 第一个返回false,第二个返回false:只有第一个的preHandle会执行
*
* 第一个返回true,第二个返回false:两个(全部)拦截器的preHandle都会执行,
* 但是(全部)postHandle都不会执行,
* 而afterCompletion只有第一个(返回false的拦截器之前的所有afterCompletion)会执行
*
* 第一个返回false,第二个返回true:只有第一个的preHandle会执行
*/
@RequestMapping("/testInterceptor")
public String testInterceptor(){
//System.out.println(1/0);
return "success";
}
}
4.FirstInterceptor.java
package com.atguigu.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class FirstInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("First:afterCompletion");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("First:posthandle");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("First:preHandle");
return true;//true:放行 false:拦截
}
}
5.SecondInterceptor.java
package com.atguigu.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class SecondInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("Second:afterCompletion");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("Second:posthandle");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("Second:preHandle");
return false;//true:放行 false:拦截
}
}