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

测试

相关推荐
计算机程序设计小李同学23 分钟前
动漫之家系统设计与实现
java·spring boot·后端·web安全
布列瑟农的星空39 分钟前
SSE与流式传输(Streamable HTTP)
前端·后端
程序员阿鹏1 小时前
责任链模式
java·spring·servlet·tomcat·maven·责任链模式
开心就好20251 小时前
使用 HBuilder 上架 iOS 应用时常见的问题与应对方式
后端
开心猴爷1 小时前
Swift IPA 混淆在工程实践中的方式,分析仅依赖源码层混淆的局限性
后端
用户4099322502121 小时前
Vue3 v-if与v-show:销毁还是隐藏,如何抉择?
前端·vue.js·后端
黄俊懿1 小时前
【深入理解SpringCloud微服务】Seata(AT模式)源码解析——全局事务的回滚
java·后端·spring·spring cloud·微服务·架构·架构师
Java编程爱好者1 小时前
SpringBoot启动太慢?几个优化技巧
后端
喷火龙8号1 小时前
修复 Hertz + OpenTelemetry 链路追踪中的数据竞争问题
后端
JIngJaneIL1 小时前
基于springboot + vue健康管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端