拦截器
拦截器
1、概述
Interceptor
一个SpringMVC中的组件
作用:拦截目标Handler,为Handler提供权限过滤、释放资源、改变视图等等作用
2、自定义拦截器实现步骤
2.1 编写一个类【MyInterceptor1】,实现HandlerInterceptor,重写三个方法
package com.qf.java2007.web.interceptors;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author ghy
* @version 1.0
*/
public class MyInterceptor1 implements HandlerInterceptor {
/**
* 在目标Handler执行之前执行,一般用于权限拦截
* @param request
* @param response
* @param handler
* @return 是否放行, true : 放行【可以执行后续操作】, false : 不放行【直接中断操作】
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("在目标Handler执行之前执行.........11111");
return true;
}
/**
* 在目标Handler执行之后、渲染视图之前执行,可以改变响应结果
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("在目标Handler执行之后、渲染视图之前执行.........1111");
//modelAndView.setViewName("redirect:/index.jsp");
}
/**
* 在渲染视图之后执行,可以释放资源
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("在渲染视图之后执行.........1111");
}
}
2.2 springmvc配置文件中配置拦截器
- 配置拦截规则
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.qf.java2007.web.interceptors.MyInterceptor1"></bean>
</mvc:interceptor>
</mvc:interceptors>
2.3 测试
测试效果:http://localost/test1 |
---|
![]() |
3、拦截器链
- 由多个拦截器组成
3.1 执行顺序
- 先执行拦截一的preHandler方法
- 如果返回flase,直接中断操作
- 如果返回true,执行拦截器二的preHandler方法
- 如果拦截二返回false,再执行拦截器一afterCompletion
- 如果拦截二返回true,执行Handler,再执行拦截二的postHandle,再执行拦截一的postHandle,再执行拦截二的afterCompletion方法,最后执行拦截器一afterCompletion