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

测试

相关推荐
葫芦和十三4 小时前
图解 MongoDB 07|索引类型:七种索引,七种访问形状
后端·mongodb·agent
朦胧之6 小时前
AI 编程-老项目改造篇
java·前端·后端
爱勇宝8 小时前
我做了一个只用来搜歌词的小 App
android·前端·后端
IT_陈寒9 小时前
SpringBoot自动配置坑了我一晚上,原来问题出在这
前端·人工智能·后端
SelectDB10 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
SelectDB10 小时前
秒级弹性、最高降本 70%:SelectDB Serverless 如何重塑云数仓资源效率
大数据·后端·云原生
PinkSun10 小时前
Spring AI ChatMemory踩坑实录:重启丢数据、Agent丢记忆、对话溢出
后端·ai编程
壹方秘境10 小时前
我用Go语言开发了一个跨平台的HTTPS抓包和调试工具
前端·后端·ios
神秘面具男10 小时前
HarmonyOS 6.0跨端远程控制
前端·后端