学习SpringMVC(3)——拦截器
1、拦截器概述
1)SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术
2)可以定义拦截器链,拦截器链就是拦截器按照一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按照定义的顺序执行
3)拦截器和过滤器的功能比较类似,但是有区别:
a.过滤器时Servlet规范的一部分,任何框架都可以使用过滤器的技术
b.拦截器时SpringMVC框架独有的,只能在SpringMVC框架中使用
c.过滤器配置了/*,可以拦截任何资源
d.拦截器只对控制器中的方法进行拦截
4)拦截器也是AOP思想的一种实现方式
5)想要自定义拦截器,需要实现HandlerInterceptor接口
2、自定义拦截器步骤
1)创建类,实现HandlerInterceptor接口
HandlerInterceptor 接口中定义了三个方法,我们就是通过这三个方法来对用户的请求进行拦截处理的。
1. 可以使用request或者response跳转到指定的页面
2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
3. return false不放行,不会执行controller中的方法。
postHandle是controller方法执行后执行的方法,在JSP视图执行前。
1. 可以使用request或者response跳转到指定的页面
2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
postHandle方法是在JSP执行后执行
1. request或者response不能再跳转页面了
public class MyIntercepor implements HandlerInterceptor{ /** * 预处理拦截 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("拦截器执行了。。。前"); return true; } /** * 在业务处理器处理请求执行完成后,生成视图之前执行的动作 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("拦截器执行了。。。后"); } /** * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 * @param request * @param response * @param handler * @param ex * @throws Exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("拦截器执行了...最后"); }
2)在springmvc.xml中配置拦截器
<mvc:interceptors> <mvc:interceptor> <!-- 要拦截的方法 --> <mvc:mapping path="/user/*"/> <!-- 配置拦截器对象 --> <bean class="interceptor.MyIntercepor"></bean> </mvc:interceptor> </mvc:interceptors>
3、配置多个拦截器
1)再编写一个相同的拦截器
2)在springmvc.xml中配置拦截器
<mvc:interceptors> <mvc:interceptor> <!-- 要拦截的方法 --> <mvc:mapping path="/user/*"/> <!-- 配置拦截器对象 --> <bean class="interceptor.MyIntercepor1"></bean> </mvc:interceptor> <!-- 第二个拦截器在这里配置--> <mvc:interceptor> <!-- 要拦截的方法 --> <mvc:mapping path="/user/*"/> <!-- 配置拦截器对象 --> <bean class="interceptor.MyIntercepor2"></bean> </mvc:interceptor> </mvc:interceptors>
3)执行顺序
拦截器执行了。。。前11111
拦截器执行了。。。前222222
控制器执行了
拦截器执行了。。。后222222
拦截器执行了。。。后111111
页面也执行了
拦截器执行了...最后2222222
拦截器执行了...最后111111
注意:在我测试的时候我用<mvc:resources>不拦截静态资源居然不管用,也不知道是怎么回事,希望有大神指正下应该怎么做
<!-- 对静态资源文件的访问--> <mvc:resources mapping="/images/**" location="/images/"/> <mvc:resources mapping="/css/**" location="/css/" /> <mvc:resources mapping="/js/**" location="/js/" /> <mvc:resources mapping="/favicon.ico" location="favicon.ico" />
所以我只好在web.xml进行了对静态资源不拦截的配置
<!-- 不拦截静态文件 --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/js/*</url-pattern> <url-pattern>/css/*</url-pattern> <url-pattern>/images/*</url-pattern> <url-pattern>/fonts/*</url-pattern> </servlet-mapping>