一、过滤器和拦截器的区别
拦截器在实现上是基于Java的反射机制,属于面向切面编程的一种运用。 可以使用Spring的依赖注入进行业务操作。一个拦截器实例在一个controller生命周期之内可以多次调用。但是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求无法拦截处理。
(1)使用范围不同
- JavaWeb中学过的过滤器(Filter)是Java EE体系中的组件。
- 拦截器(Interceptor)是SpringMVC框架中的组件。
(2)执行时机不同
- 过滤器是运行在
所有Servlet之前
。 - 拦截器是运行在
DispatcherServlet之后
。
通常在使用Spring MVC框架后,推荐使用拦截器来实现登录的处理。
二、演示使用拦截器
1.单个拦截器的执行顺序
(1)定义一个拦截器
package com.gql.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 类说明:
* 拦截器1
* @guoqianliang1998.
*/
public class MyInterceptor1 implements HandlerInterceptor {
//在handler之前执行
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("处理器执行前...");
return true;//放行
}
//在handler返回MovelAndView后执行
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("处理器执行中...");
}
//在handler返回MovelAndView后执行 最终执行
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("处理器执行后...");
}
}
(2)配置拦截器
在SpringMVC配置中进行如下配置,其中/**表示拦截多级目录
<!-- 自定义拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.gql.interceptor.MyInterceptor1"></bean>
</mvc:interceptor>
</mvc:interceptors>
(3)Handler处理器
package com.gql.upload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.gql.ex.MyException;
import com.gql.pojo.User;
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/add")
public String add(User user) throws MyException{
System.out.println("添加用户成功");
return "success";
}
}
上面的测试执行后,运行顺序如下,
单个拦截器的执行顺序如下图:
2.多个拦截器的执行顺序
总结:
- 拦截器的
perHandle()方法
顺序执行- 拦截器的
postHandle()方法
和afterCompletion方法
逆序执行。- 这里说的顺序和倒序是指SpringMVC配置文件中的拦截器的配置顺序。