目录
一,拦截器的职责
二,拦截器的应用场景
三,拦截器的工作原理
拦截器在Spring MVC请求处理流程中的位置:
四,使用拦截器
一 ,编写拦截类,实现HandlerInterceptor接口,重写方法
二 ,编写拦截器配置类用于配置拦截器的执行位置。
三,springmvc配置类加载拦截配置类所在包,并且把拦截类纳入spring扫描的范围内
五 案例(验证 preHandle方法返回值不同对被访问方法产生的影响)
preHandle方法返回值:true 放行
preHandle方法返回值:false 拦截,不进行到下一步
一,拦截器的职责
- 拦截,访问controller控制层的映射路径
二,拦截器的应用场景
- 权限验证:
- 当你浏览某一界面,想要点击去看,发现 你没有登录,就会跳转到登录界面
三,拦截器的工作原理
拦截器在Spring MVC请求处理流程中的位置:
客户端请求 → DispatcherServlet → 拦截器preHandle → 控制器 → 拦截器postHandle → 视图渲染 → 拦截器afterCompletion → 响应客户端
四,使用拦截器
准备工作:添加web起步依赖
一 ,编写拦截类,实现HandlerInterceptor接口,重写方法
作用:制定拦截规则,当拦截到指定的映射路径
重写三个方法【preHandle、postHandle、afterCompletion】)。该类要交给spring容器管理(把注解@Component写在类上)
package interpector;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
// 交给 spring 容器管理
@Component
// 拦截器
public class Userlnterpector implements HandlerInterceptor {// preHandle 方法在 客户端发送请求到达DispatcherServlet之前执行。@Overridepublic boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {System.out.println("before controller doing");// 返回false 表示拦截,返回true 表示放行return true;}
// afterCompletion 方法在 controller类中被访问方法执行之后,还未被 客户端 响应之前执行。@Overridepublic void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afer controller doing........");}
// postHandle 方法controller类中被访问方法执行时候执行。@Overridepublic void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("doing controller......");}
}
二 ,编写拦截器配置类用于配置拦截器的执行位置。
作用:将自定义拦截类注册和添加拦截路径
该类继承WebMvcConfigurationSupport类,重写addInterceptors方法,在此方法的实现中添加拦截路径)
package config;
import interpector.Userlnterpector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
// 拦截器配置类
@Configuration
// 继承WebMvcConfigurationSupport
public class InterpectorConfig extends WebMvcConfigurationSupport {// 注入拦截器对象@Autowiredprivate Userlnterpector userInterpector;@Overrideprotected void addInterceptors(InterceptorRegistry registry) {// 拦截器注册,添加拦截路径/user/**,给静态资源放行/static/** registry.addInterceptor(userInterpector).addPathPatterns("/user/**").excludePathPatterns("/static/**");}
}
三,springmvc配置类加载拦截配置类所在包,并且把拦截类纳入spring扫描的范围内
springmvc配置类
package config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan({"controller","interpector","config"})
@Configuration
public class springmvcConfig {}
五 案例(验证 preHandle方法返回值不同对被访问方法产生的影响)
preHandle方法返回值:true 放行
按照以下顺序,执行
客户端请求 → DispatcherServlet → 拦截器preHandle → 控制器 → 拦截器postHandle → 视图渲染 → 拦截器afterCompletion → 响应客户端
案例
自定义拦截类代码:
package interpector;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
// 交给 spring 容器管理
@Component
// 拦截器
public class Userlnterpector implements HandlerInterceptor {// preHandle 方法在 客户端发送请求到达DispatcherServlet之前执行。@Overridepublic boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {System.out.println("before controller doing");// 返回false 表示拦截,返回true 表示放行return true;}
// afterCompletion 方法在 controller类中被访问方法执行之后,还未被 客户端 响应之前执行。@Overridepublic void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afer controller doing........");}
// postHandle 方法controller类中被访问方法执行时候执行。@Overridepublic void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("doing controller......");}
}
拦截配置类
package config;
import interpector.Userlnterpector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
// 拦截器配置类
@Configuration
// 继承WebMvcConfigurationSupport
public class InterpectorConfig extends WebMvcConfigurationSupport {// 注入拦截器对象@Autowiredprivate Userlnterpector userInterpector;@Overrideprotected void addInterceptors(InterceptorRegistry registry) {// 拦截器注册,添加拦截路径/user/**registry.addInterceptor(userInterpector).addPathPatterns("/user/**");}
}
springmvc加载 拦截配置类和扫描拦截类所在的包
package config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan({"controller","interpector","config"})
@Configuration
public class springmvcConfig {}
controller类被访问的方法
package controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class userController {@RequestMapping("/login")public String login(){System.out.println("rwrwr");System.out.println("login11111111111111");return "ok";}
}
测试
比较:【客户端请求 → DispatcherServlet → 拦截器preHandle → 控制器 → 拦截器postHandle → 视图渲染 → 拦截器afterCompletion → 响应客户端】
preHandle方法返回值:false 拦截,不进行到下一步
测试