1. 概述
Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等
其实我认为在不考虑具体内部的实现方法时,过滤器和拦截器没什么区别,都是用来处理所有请求的共性问题
2. 使用
① 通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义
public class InterceptorUtil implements HandlerInterceptor{
//进入Handler方法之前执行
//可以用于身份认证、身份授权。如果认证没有通过表示用户没有登陆,需要此方法拦截不再往下执行,否则就放行
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
System.out.println("InterceptorUtil...........preHandle");
String user= (String) request.getSession().getAttribute("user");
if(user != null){
return true;
}
request.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(request, response);
//true表示放行,false表示不放行
return false;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
System.out.println("InterceptorUtil...........postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println("InterceptorUtil...........afterCompletion");
}
}
preHandle() 方法:
该方法会在控制器方法前执行,其返回值表示是否中断后续操作。
当其返回值为true时,表示继续向下执行;
当其返回值为false时,会中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)
可以用于身份认证、身份授权。比如如果认证没有通过表示用户没有登陆,需要此方法拦截不再往下执行(return false),否则就放行(return true)。
postHandle()方法:
进入Handler方法之后,返回ModelAndView之前执行。可以看到该方法中有个modelAndView的形参。应用场景:从modelAndView出发:将公用的模型数据(比如菜单导航之类的)在这里传到视图,也可以在这里同一指定视图
afterCompletion()方法:
该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作
② 在配置文件进行配置
注意:拦截器不是在web.xml配置的,比如struts在struts.xml配置,在springMVC在spring与springMVC整合的配置文件中配置
<!-- 拦截器配置 -->
<mvc:interceptors>
<!--多个拦截器,顺序执行 -->
<!-- 登陆认证拦截器 -->
<mvc:interceptor>
<!-- /** 表示拦截所有url包括子url路径,/*只拦截根下的url -->
<mvc:mapping path="/**"/>
<bean class="com.cn.util.InterceptorUtil"></bean>
</mvc:interceptor>
<!-- 其他拦截器 -->
</mvc:interceptors>
3. 多个拦截器的执行顺序

4. 拦截器和过滤器还有监听器的区别
- 监听器:
监听器最好区分,它是实现了javax.servlet.ServletContextListener接口的服务器端程序,它主要对域对象进行监听,过滤器依赖与servlet容器
- 过滤器:
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序
- 拦截器
拦截器不依赖与servlet容器,是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现
拦截器不是在web.xml配置的,比如struts在struts.xml配置,在springMVC在spring与springMVC整合的配置文件中配置
本文详细介绍了SpringMVC中的拦截器(Interceptor)概念,包括其实现方式、配置方法及在权限验证、日志记录等场景的应用。同时对比了拦截器与过滤器、监听器的区别。
3102

被折叠的 条评论
为什么被折叠?



