SpringMVC 拦截器
SpringMVC 框架中的拦截器用于对处理器进行预处理和后处理的技术。
可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
拦截器和过滤器的功能比较类似,有区别
1. 过滤器是 Servlet 规范的一部分,任何框架都可以使用过滤器技术。 2. 拦截器是 SpringMVC 框架独有的,因此只对控制器方法产生作用。 3. 过滤器配置了 /*,可以拦截任何资源,因此静态资源需要在配置中排除。
springmvc.xml 配置静态资源过滤
<!-- location 表示路径,mapping 表示文件,** 表示该目录下的文件以及子目录的文件 --> <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/images/" mapping="/images/**"/> <mvc:resources location="/scripts/" mapping="/javascript/**"/>
拦截器只会对控制器中的方法进行拦截。
拦截器也是 AOP 思想的一种实现方式
想要自定义拦截器,需要实现 HandlerInterceptor 接口,然后根据需要重写里面方法。
简而言之拦截器就是对控制层执行前后进行处理的工具,之前学过的 @ModelAttribute 注解也可以对 Controller 参数进行预处理,只是 @ModelAttribute 只是将处理好参数返给控制器了。拦截器明显可以做更多事,例如看请求中是否包含某信息,不包含则跳转到错误页面,包含则正常执行控制层。
自定义拦截器步骤
创建类,实现 HandlerInterceptor 接口,idea 按 ctrl+ o 重写需要方法,返回 true 放行,反之拦截。可以做登录前的验证,未登录预处理重定向或转发跳转到登录页面。
public class MyInterceptor1 implements HandlerInterceptor { /** * controller 方法执行前,进行拦截的方法 * return true 放行 * return false 拦截 * 可以使用转发或者重定向直接跳转到指定的页面。 */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(" 拦截器执行了..."); return true; } }
配置 springmvc.xml,以下配置了两拦截器,执行顺序,12->Controller->21->JSP->21
<!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 哪些方法进行拦截 --> <mvc:mapping path="/user/*"/> <!-- 哪些方法不进行拦截 <mvc:exclude-mapping path=""/> --> <!-- 注册拦截器对象 --> <bean class="cn.cheng.demo1.MyInterceptor1"/> </mvc:interceptor> <mvc:interceptor> <!-- 哪些方法进行拦截 --> <mvc:mapping path="/**"/> <!-- 哪些方法不进行拦截 <mvc:exclude-mapping path=""/> --> <!-- 注册拦截器对象 --> <bean class="cn.cheng.demo1.MyInterceptor2"/> </mvc:interceptor> </mvc:interceptors>
preHandle 方法是 controller 方法执行前拦截的方法
可以使用 request 或者 response 跳转到指定的页面
return true 放行,执行下一个拦截器,如果没有拦截器,执行 controller 中的方法。
return false 不放行,不会执行 controller 中的方法。
postHandle 是 controller 方法执行后执行的方法,在 JSP 视图执行前。
可以使用 request 或者 response 跳转到指定的页面
如果指定了跳转的页面,那么 controller 方法跳转的页面将不会显示。
afterHandle 方法是在 JSP 执行后执行
request 或者 response 不能再跳转页面了
- 自定义拦截器步骤
- 自定义拦截器步骤