12.1、简介
- SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。
- 过滤器与拦截器的区别:拦截器是AOP思想的具体应用。
- 过滤器
- servlet规范中的一部分,任何java web工程都可以使用
- 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截
- 拦截器
- 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
- 拦截器只会拦截访问的控制器(controller)方法,如果访问的是jsp/html/css/image/js是不会进行拦截的
12.2、项目演示
-
编写处理请求的方法,controller
-
编写拦截器interceptor
package com.likea.interceptor; public class MyInterceptor implements HandlerInterceptor { //手动重写三个方法 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("处理前"); return true;//返回true,执行下一个拦截器,放行;返回false,不执行下一个拦截器 // return false; //会卡在拦截器,不执行请求 } @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("清理"); } }
-
配置拦截器
<!--配置拦截器--> <mvc:interceptors> <mvc:interceptor> <!-- /:拦截当前请求 /**:拦截当前请求下的所有请求 /admin/**:拦截admin下的所有请求 --> <mvc:mapping path="/**"/> <!--拦截器地址--> <bean class="com.likea.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
-
运行测试,请求执行;拦截器返回false,请求被拦截不会执行
12.3、登录拦截
-
controller处理请求
package com.likea.controller; @Controller @RequestMapping("/user") public class LoginController { //直接进入main页面的请求 @RequestMapping("/main") public String test() { return "main"; } //跳转到login页面 @RequestMapping("/goLogin") public String login() { return "login"; } @RequestMapping("/login") public String login(String username