springmvc-拦截器

目录

一,拦截器的职责

二,拦截器的应用场景

三,拦截器的工作原理

[拦截器在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 拦截,不进行到下一步

测试

相关推荐
16Miku12 分钟前
基于SpringAI的电商客服智能体
spring·ai
免檒1 小时前
go语言协程调度器 GPM 模型
开发语言·后端·golang
不知道写什么的作者1 小时前
Flask快速入门和问答项目源码
后端·python·flask
caihuayuan52 小时前
生产模式下react项目报错minified react error #130的问题
java·大数据·spring boot·后端·课程设计
一只码代码的章鱼2 小时前
Spring Boot- 2 (数万字入门教程 ):数据交互篇
spring boot·后端·交互
找不到、了4 小时前
Spring-Beans的生命周期的介绍
java·开发语言·spring
caihuayuan44 小时前
React Native 0.68 安装react-native-picker报错:找不到compile
java·大数据·sql·spring·课程设计
不再幻想,脚踏实地5 小时前
Spring AOP从0到1
java·后端·spring
编程乐学(Arfan开发工程师)5 小时前
07、基础入门-SpringBoot-自动配置特性
java·spring boot·后端
会敲键盘的猕猴桃很大胆5 小时前
Day11-苍穹外卖(数据统计篇)
java·spring boot·后端·spring·信息可视化