SpringMVC拦截器的配置和使用
思路:
- web.xml配置SpringMVC前端控制器初始化时优先加载spring-mvc.xml
- 在SpringMVC的xml配置文件当中使用标签添加拦截器类为bean
- 编写拦截器类,继承extends HandlerInterceptorAdapter类,重写preHandle、postHandle和afterCompletion方法
web.xml
代码语言:javascript复制 com
web/index.jsp
default
*.js
default
*.css
default
*.html
contextConfigLocation
classpath:spring-core.xml
org.springframework.web.context.ContextLoaderListener
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
encodingFilter
/*
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
dispatcherServlet
/
spring-core.xml
代码语言:javascript复制
spring-mvc.xml (关键配置文件)
代码语言:javascript复制
IndexInterceptor.java
代码语言:javascript复制package com.gxwz.interceptor;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
/**
* 在业务处理器处理请求之前被调用
* 如果返回false
* 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
* 如果返回true
* 执行下一个拦截器,直到所有的拦截器都执行完毕
* 再执行被拦截的Controller
* 然后进入拦截器链,
* 从最后一个拦截器往回执行所有的postHandle()
* 接着再从最后一个拦截器往回执行所有的afterCompletion()
* 与过滤器的区别
* 1.过滤器是依赖于Servlet容器,基于回调函数,Interceptor依赖与框架,基于反射机制
* 2.过滤器的过滤范围更大,还可以过滤一些静态资源,拦截器只拦截请求
*/
public class IndexInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,HttpServletResponse response,
Object handler) throws Exception {
//业务逻辑代码编写...(如:解决乱码,权限验证)
System.out.println("preHandle(), 在访问Controller之前被调用");
return true;
}
/**
* 在业务处理器处理请求执行完成后,生成视图之前执行的动作
* 可在modelAndView中加入数据,比如当前时间
*/
@Override
public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
//业务逻辑代码编写...(如:操作日志记录,更改视图信息)
System.out.println("postHandle(), 在访问Controller之后,访问视图之前被调用,这里可以注入一个时间到modelAndView中,用于后续视图显示");
modelAndView.addObject("date","由拦截器生成的时间:" new Date());
}
/**
* 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
* 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
*/
@Override
public void afterCompletion(HttpServletRequest request,HttpServletResponse response,
Object handler, Exception ex) throws Exception {
//业务逻辑代码编写...(如:,资源销毁,异常处理)
System.out.println("afterCompletion(), 在访问视图之后被调用");
}
}