一 拦截器概述
拦截器技术比较像java web技术中的过滤器技术,都是发送 请求时被拦截器拦截,在控制器的前后添加额外功能。但是和Spring中的Aop技术是由区别的。AOP 在特定方法前后扩充(一般是对 ServiceImpl的方法进行扩充),而拦截器是对控制器的请求进行拦截。
但是拦截器和java web的过滤器也是有区别的,拦截器只能拦截控制器的请求,对jsp和静态资源不拦截,因为拦截器是SpingMVC的技术,SpringMVC的总入口是DispatcherServlet,我们在配置DsipatcherServlet时,就已经把DispatcherServlet可以接收的请求限定为Controller的请求。而Java Web中的 Filter 可以拦截任何请求。
二 实现自定义拦截器
第一步:创建一个拦截器类,并继承HandlerInterceptor接口
在HandlerInterceptor接口中有三个方法
(1)preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2)
执行时间:控制器之前执行
如果返回值为true,则放行到控制器,
如果返回值为false,直接返回,不放行,
一般情况下,如果不放行,一般会sendRedirect("")让其跳转到一个特定的页面,
arg2:要拦截的控制器的方法
(2)postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception
执行时间:控制器之后,jsp执行之前 执行,如果控制器抛出了异常,便不会走该方法 arg3:模型和视图 功能:一般用来记录日志,或者敏感词过滤
structs的后置拦截器是无法修改ModelAndView,但是springMVC是可以修改的,也就是ModelAndView的值是可以修改的
(3)afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception
执行时间:执行完jsp之后才执行
根据arg3参数是否为null来判断是否出现了异常
无论是否出现异常,该方法都会执行,因为有一个Exception类型的参数,因此可以用来记录异常
package com.ssm.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class DemoInterceptor implements HandlerInterceptor{ /** * 控制器之前执行,如果返回值为true,则放行到控制器,如果返回值为false,直接返回,不放行,一般情况下,如果不放行,一般会sendRedirect("") * 让其跳转到一个页面 * arg2:要拦截的控制器的方法 */ @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println("preHandle方法执行了"); return true; } /** * 控制器之后,jsp执行之前 执行,如果控制器抛出了异常,便不会走该方法 * arg3:模型和视图 * 功能:一般用来记录日志,或者敏感词过滤 * structs的后置拦截器是无法修改ModelAndView,但是springMVC是可以修改的,也就是ModelAndView的值是可以修改的 */ @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println("postHandle 方法执行了"); System.out.println(arg3.getViewName()); System.out.println(arg3.getView()); System.out.println(arg3.getModel().get("modelKye")); } /** * 执行完jsp之后才执行 * * 根据arg3参数是否为null来判断是否出现了异常 * 无论是否出现异常,该方法都会执行,因为有一个Exception类型的参数,因此可以用来记录异常 */ @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println("afterCompletion方法执行了"); } }
三 配置拦截器,就像Filter一样,拦截器也需要配置
在SpringMVC的配置文件中进行配置,有两种配置方式,一种是拦截所有请求,第二种是拦截特定请求。
下面的代码是拦截所有请求,拦截特定请求的被注释了
<!-- 配置拦截器 --> <mvc:interceptors> <!-- 表示所有的控制器请求都拦截 --> <bean class="com.ssm.interceptor.DemoInterceptor"></bean> <!-- 拦截特定请求 --> <!-- <mvc:interceptor> <mvc:mapping path="/demo"/> <bean class="com.ssm.interceptor.DemoInterceptor"></bean> </mvc:interceptor> --> </mvc:interceptors>