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

测试

相关推荐
~Yogi2 分钟前
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
学习·spring·缓存
why1515 小时前
微服务商城-商品微服务
数据库·后端·golang
結城7 小时前
mybatisX的使用,简化springboot的开发,不用再写entity、mapper以及service了!
java·spring boot·后端
星辰离彬8 小时前
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
java·spring boot·后端·sql·mysql·性能优化
q_19132846958 小时前
基于Springboot+Vue的办公管理系统
java·vue.js·spring boot·后端·intellij idea
陪我一起学编程9 小时前
关于nvm与node.js
vue.js·后端·npm·node.js
舒一笑9 小时前
基于KubeSphere平台快速搭建单节点向量数据库Milvus
后端
JavaBuild10 小时前
时隔半年,拾笔分享:来自一个大龄程序员的迷茫自问
后端·程序员·创业
hstar952710 小时前
三十四、面向对象底层逻辑-SpringMVC九大组件之FlashMapManager接口设计哲学
java·spring·设计模式·架构