关于拦截器
SpringMVC的处理器拦截器类似于Servlet开发中的顾虑器Filter,用于对处理器进行预处理和后处理。
用户可以自己定义一些拦截器来实现特定的功能。
谈到拦截器,还要向大家提一个词----拦截器链(Interceptor Chain),拦截器链就是将拦截器按一定的顺序连接成一条链,在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
说到这里,可能就有一个疑问,这不是我们之前学的过滤器吗?是的它和过滤器是有几分相似,但是也有区别,接下来我们就来说说它们的区别:
1.过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术
2.拦截器是SpringMVC独有的
3.过滤器配置了/*,可以拦截任何资源
4.拦截器只会对控制器中的方法进行拦截
拦截器也是AOP思想的具体应用。
要实现自定义拦截器,必须事先++HandlerInterceptor接口++
自定义拦截器步骤
1.创建类,实现HandlerInterceptor接口,重写需要的方法
package com.mrdeer.Interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 自定义拦截器
*/
public class testInterceptor implements HandlerInterceptor {
/**
* 预处理:controller方法执行前执行
* 返回true放行,执行下一个拦截器,
* 如果没有,执行controller方法
* 返回false不放行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器执行");
return true;
}
}
2,在springmvc.xml中配置拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 要拦截的方法 -->
<mvc:mapping path="/user/testInterceptor"/>
<!-- 不要拦截的方法 -->
<!--<mvc:exclude-mapping path=""/>-->
<!--配置拦截器对象-->
<bean class="com.mrdeer.Interceptor.testInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
HandlerInterceptor接口中的方法
-
preHandle方法是controller方法执行前拦截的方法
1.可以使用request或者response跳转到指定页面
2.return true放行,执行下一个拦截器,如果没有拦截器,执行controller方法
3.return false不放行,不会执行controller方法 -
postHandler方法是controller方法执行后执行的方法,在跳转页面执行前执行
1.可以使用request和response跳转到指定页面
2.如果指定了跳转的页面,那么controller方法跳转的页面将不会显示 -
afterCompletion方法是在跳转页面执行后执行
1.request或者response不能再跳转页面了
配置多个拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 要拦截的方法 -->
<mvc:mapping path="/user/testInterceptor"/>
<!-- 不要拦截的方法 -->
<!--<mvc:exclude-mapping path=""/>-->
<!--配置拦截器对象-->
<bean class="com.mrdeer.Interceptor.testInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<!-- 要拦截的方法 -->
<mvc:mapping path="/user/testInterceptor"/>
<!-- 不要拦截的方法 -->
<!--<mvc:exclude-mapping path=""/>-->
<!--配置拦截器对象-->
<bean class="com.mrdeer.Interceptor.testInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>