目录
[拦截器在Spring MVC请求处理流程中的位置:](#拦截器在Spring MVC请求处理流程中的位置:)
[一 ,编写拦截类,实现HandlerInterceptor接口,重写方法](#一 ,编写拦截类,实现HandlerInterceptor接口,重写方法)
[二 ,编写拦截器配置类用于配置拦截器的执行位置。](#二 ,编写拦截器配置类用于配置拦截器的执行位置。)
三,springmvc配置类加载拦截配置类所在包,并且把拦截类纳入spring扫描的范围内
[五 案例(验证 preHandle方法返回值不同对被访问方法产生的影响)](#五 案例(验证 preHandle方法返回值不同对被访问方法产生的影响))
[preHandle方法返回值:true 放行](#preHandle方法返回值:true 放行)
[preHandle方法返回值:false 拦截,不进行到下一步](#preHandle方法返回值:false 拦截,不进行到下一步)
一,拦截器的职责
- 拦截,访问controller控制层的映射路径
二,拦截器的应用场景
- 权限验证:
- 当你浏览某一界面,想要点击去看,发现 你没有登录,就会跳转到登录界面
三,拦截器的工作原理
拦截器在Spring MVC请求处理流程中的位置:
java
客户端请求 → DispatcherServlet → 拦截器preHandle → 控制器 → 拦截器postHandle → 视图渲染 → 拦截器afterCompletion → 响应客户端
四,使用拦截器
准备工作:添加web起步依赖
一 ,编写拦截类,实现HandlerInterceptor接口,重写方法
作用:制定拦截规则,当拦截到指定的映射路径
重写三个方法【preHandle、postHandle、afterCompletion】)。该类要交给spring容器管理(把注解@Component写在类上)
java
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之前执行。
@Override
public 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类中被访问方法执行之后,还未被 客户端 响应之前执行。
@Override
public 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类中被访问方法执行时候执行。
@Override
public 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方法,在此方法的实现中添加拦截路径)
java
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 {
// 注入拦截器对象
@Autowired
private Userlnterpector userInterpector;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
// 拦截器注册,添加拦截路径/user/**,给静态资源放行/static/**
registry.addInterceptor(userInterpector).addPathPatterns("/user/**").excludePathPatterns("/static/**");
}
}
三,springmvc配置类加载拦截配置类所在包,并且把拦截类纳入spring扫描的范围内

springmvc配置类
java
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 → 响应客户端
案例
自定义拦截类代码:
java
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之前执行。
@Override
public 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类中被访问方法执行之后,还未被 客户端 响应之前执行。
@Override
public 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类中被访问方法执行时候执行。
@Override
public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("doing controller......");
}
}
拦截配置类
java
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 {
// 注入拦截器对象
@Autowired
private Userlnterpector userInterpector;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
// 拦截器注册,添加拦截路径/user/**
registry.addInterceptor(userInterpector).addPathPatterns("/user/**");
}
}
springmvc加载 拦截配置类和扫描拦截类所在的包
java
package config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan({"controller","interpector","config"})
@Configuration
public class springmvcConfig {
}
controller类被访问的方法
java
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 拦截,不进行到下一步

测试

