拦截器
若是Maven项目,需要引入
javax.servlet-api包,注意要将依赖范围设置为provided,因为拦截器中的参数需要用到该包中的类
自定义类实现HandlerInterceptor接口,重写preHandle()、postHandle()和afterCompletion()方法,这三个方法都是默认方法
preHandle():前置执行处理,进入控制器之前执行,若返回false则后续不会执行postHandle():目标资源已被SpringMVC进行处理,即控制器方法被执行完(return了之后)后执行afterCompletion():响应文本已产生,即响应HTML字符串或JSON字符串生成后执行
同时设置多个拦截器的执行顺序为,请求时按照配置顺序进行执行,响应时按照配置逆序执行,若期间某个拦截器出现了异常,则后续拦截器不会被执行,而是直接逆序执行
afterCompletion()方法,而不会执行postHandle()方法
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("前置处理");
return true; //返回true后续会接着执行
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("控制器方法执行完毕");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("响应文本已经生成");
}
}
之后再在Spring全局配置文件applicationContext.xml中添加下面配置,但是要注意<mvc:default-servlet-handler/>设置对拦截器是不起作用的,静态资源还是会被拦截器拦截到
<mvc:interceptors> <!--设置SpringMVC拦截器,-->
<mvc:interceptor> <!--设置单个拦截器,可设置多个拦截器-->
<mvc:mapping path="/**"/> <!--拦截的路径,可是设置多个-->
<mvc:exclude-mapping path="/**.jsp"/> <!--不拦截的路径,可是设置多个-->
<bean class="com.MyInterceptor"/> <!--拦截器类-->
</mvc:interceptor>
</mvc:interceptors>
使用下面代码进行测试
public class Main {
@GetMapping("/test")
@ResponseBody
public String test() {
System.out.println("控制器中的方法");
return "test";
}
}

Comments NOTHING