拦截器源码分析

2023-11-14

@Slf4j
@Controller
public class BlueController {


    @ResponseBody
    @GetMapping("/bb")
    public String bb(HttpSession session){
        return session.getAttribute("name").toString();
    }

    @ResponseBody
    @GetMapping("/login")
    public String login(HttpSession session){
        log.info("登陆进来了");
        session.setAttribute("name","123");
        return "success";
    }

}
package com.example.client.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Slf4j
//登陆拦截器
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //请求操作之前
        log.info("请求操作之前");
        Object name = request.getSession().getAttribute("name");
        if(name!=null){
            //如果不为空 放行
            return true;
        }
        //跳转到登陆界面
        response.sendRedirect("/login");
        //如果为空 拦截住
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("请求操作之后");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("视图渲染之后");
    }
}
package com.example.client.config;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.example.client.entity.Actor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.accept.HeaderContentNegotiationStrategy;
import org.springframework.web.accept.ParameterContentNegotiationStrategy;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.*;


@Configuration
public class TestConfig implements WebMvcConfigurer{


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册拦截器
        registry.addInterceptor(new LoginInterceptor())
                //拦截所有请求
                .addPathPatterns("/**")
                //放行资源
                .excludePathPatterns("/","/login");
    }
}

http://localhost:8080/bb

第一次跳转到登陆界面 拦截住了

第二次在访问bb,就是显示内容了

我们来看下源码,进入DispatcherServlet类

在这里获取handler

根据当前请求,找到可以处理请求的handler以及handler的所有拦截器

会显示我们自定义的登陆拦截器

走到applyPreHandle 点进去

在这里会遍历所有的拦截器

然后走到interceptor.preHandle这里的时候,会进入我们的登陆拦截器

当返回false的时候会进入triggerAfterCompletion方法,倒叙

如果interceptorIndex 拦截器索引大于-1,那么就会进入这个循环

获取对应的拦截器进入afterCompletion方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拦截器源码分析 的相关文章

  • 单元测试组合服务方法

    我正在为一个类编写 junit 单元测试 该类使用以下方法实现公开的接口 public Set
  • 如何配置 Spring-WS 以使用 JAXB Marshaller?

    感谢您到目前为止对此的帮助 我正在更新问题 因为我没有显示我需要的所有内容 并显示了建议的更改 肥皂输出仍然不是我想要的 servlet xml
  • JavaFX 2.0 FXML 子窗口

    经过多次搜索我发现了这个问题如何创建 javafx 2 0 应用程序 MDI https stackoverflow com questions 10915388 how to create a javafx 2 0 application
  • 具有 CRUD 功能的基于 Spring Web 的管理工具

    在 PHP Symfony 世界里有一个工具叫 Sonata Adminhttps sonata project org https sonata project org 基于 AdminLTE 模板 这是一款一体化管理工具 具有登录 菜单
  • 需要正则表达式帮助

    我正在尝试替换两次或多次出现的 br like br br br 标签与两个一起 br br 具有以下模式 Pattern brTagPattern Pattern compile lt s br s s gt s 2 Pattern CA
  • Android volley使用RequestFuture.get()时出现超时异常

    在我的片段中 我尝试使用 TMDB 的开放电影数据库来获取有关 正在播放 电影的详细信息 如果我使用 RequestFuture get time TimeUnit 方法来执行此齐射请求 我总是会收到超时错误 如果我在 Safari 中手动
  • Java - JPanel 内有边距和 JTextArea

    我想创建这样的东西 主面板有其边距 x 并且 TextArea 位于该面板的中心 几乎填满了面板 底部是另一个具有自定义尺寸 高度 y 的面板 可以使用某些快捷方式将其切换为可见和不可见 底部面板有 FlowLayout 和几个元素 问题是
  • Android 解析 JSON 卡在 get 任务上

    我正在尝试解析一些 JSON 数据 我的代码工作了一段时间 我不确定我改变了什么突然破坏了代码 当我运行代码时 我没有收到任何运行时错误或警告 我创建一个新的 AsyncTask 并执行它 当我打电话时 get 在这个新任务中 调试器在此行
  • 如何在 Bean Validation 1.0 中构造 ConstraintViolationException?

    我对 javax validation API 感到困惑 我正在编写一个简单的测试来理解它 Sample sample new Sample Set
  • java swing:向 JTree 项目添加自定义图形按钮

    我想在 JTree 中的项目右侧添加一个带有小图标的附加按钮 这可以做到吗 如果是这样 怎么办 thanks Clamp 你在这方面成功了吗 我想做同样的事情 但很难让 JButton 响应用户 设置渲染器以显示按钮的过程很顺利 但所有鼠标
  • JAXB 编组器无参数默认构造函数

    我想从 java 库中编组一个 java 对象 当使用 JAXB marschaller 编组 java 对象时 我遇到了一个问题 A 类没有无参数默认构造函数 我使用Java Decompiler来检查类的实现 它是这样的 public
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • Java String ReplaceAll 方法给出非法重复错误?

    我有一个字符串 当我尝试运行时replaceAll方法 我收到这个奇怪的错误 String str something op str str replaceAll o n it works fine str str replaceAll n
  • 在 Freemarker 模板中检查 Spring 安全角色和记录的用户名

    有谁知道 freemarker 标签来检查 freemarker 文件中的 spring 安全角色和用户名 我从网络上的几个资源中发现以下代码将打印登录的用户名 但它没有打印用户名 而是打印 登录为
  • 为什么我不能将 Collection 转换为 Collection>

    问题的关键是 为什么这会导致编译时错误 List
  • @Embeddable 中的 @GenerateValue

    我已将实体的 id 分离到一个单独的 Embeddable 类中 该实体如下 Entity Table name users public class Users EmbeddedId private Users pk id private
  • 你能快速告诉我这个伪代码是否有意义吗?

    我相信我的代码现在是万无一失的 我现在将写出伪代码 但我确实有一个问题 为什么 DRJava 要求我返回 if 语句之外的内容 正如你所看到的 我为 ex 写了 return 1 只是因为它问了 但是它永远不会返回该值 谁可以给我解释一下这
  • 如何使用 Jest 从 ElasticSearch 获取索引列表

    我正在尝试使用 Jest 检索索引列表 但我只得到 Stats statistics new Stats Builder build result client execute statistics 如何从结果中检索索引列表 除了统计之外
  • 使用 AmazonSNSClient 发送短信时的授权

    aws 官方文档如何发送短信 http docs aws amazon com sns latest dg sms publish to phone html使用 java 中的 aws SDK 非常简单 但是 当发送如底部示例所示的消息时
  • 将数组值导出到 csv 文件 java

    我只需要帮助将数组元素导出到 csv 文件 我不知道我的代码有什么问题 任何帮助将不胜感激 谢谢 for int index 0 index lt cols length index FileWriter fw new FileWriter

随机推荐

  • Qt_Qt报错No rule to make target

    第一种情况 Qt编译工程时候 所有用到的源文件包括头文件和库文件的 总路径长度不能超过190个左右字符 一旦超过 就会提示找不到那个文件 这个可能是Qt的makefile的机制问题 解决方法 工程文件夹名字命名尽量比较短 而且工程目录文件夹
  • 【java】for和foreach的区别

    一 概述 普通for循环在遍历集合时使用下标来定位集合中的元素 java在JDK1 5开始支持foreach循环 foreach在一定程度上简化了对集合的遍历 但某些情况下 foreach是不能完全代替for循环的 限制场景 1 forea
  • IC卡、ID卡、CPU卡、RFID和NFC的区别

    ID卡 ID卡是早期的电子标签 只有一个ID号 不可以存储任何数据 故叫ID卡 ID卡没有算法 不可写入数据 其ID出厂一次性写入 应用人员只可读出卡号加以利用 ID卡容易复制 安全性较低 应用 主要应用在门禁系统 企业工牌 安全性 ID
  • 【Photon Voice】介绍

    入门 Photon Voice 2是Photon Voice的后续版本 它带来了以下功能 改进了API和更好的Unity组件 与PUN2兼容 灵活性 由于现在它与PUN2分离 它可以与Photon Realtime Photon Bolt
  • PacketTracer简单使用】

    进入软件后 我所用的版本是5 3 汉化过 看到如下界面 搭建网络拓扑 上图中的1 最大空白地方叫工作空间 搭建网络拓扑的地方 分逻辑和物理空间 2处的两个图标可以切换模式 图中的3 我们需要选取的网络设备名称 如路由器 接线器 4就是具体型
  • 【ORBSLAM2点线融合】线特征图模型构建

    在SLAM中 通常用BA Bundle Adjustment 来实现多个三维点和不同相机位姿的优化 本文描述如何建立基于线特征的图优化 并推导相应的雅克比矩阵 并用g2o实现相应的类 1 线特征误差及观测模型 假设相机位姿为 T c w T
  • StableDiffusion本地部署图形化训练模块(炼丹)Kohya_ss安装步骤

    将出东方
  • websocket--技术文档--spring后台+vue基本使用

    阿丹 给大家分享一个可以用来进行测试websocket的网页 个人觉得还是挺好用的 WebSocket在线测试工具 还有一个小家伙ApiPost也可以进行使用websocket的测试 本文章只是基本使用 给大家提供思路简单实现 使用spri
  • PCL 间接平差法拟合平面

    目录 一 算法原理 1 原理概述 2 参考文献 二 代码实现 三 结果展示 一 算法原理 1 原理概述 通过传统最小二乘法对点云数据进行平面拟合时 可将误差只归因于一个方向上 本文假设误差只存在于 Z Z Z轴方向上 设点云拟合的平面方程为
  • echarts中配置项splitNumber踩坑记录

    splitNumber不按照设置的数目来显示怎么办 项目问题记录 踩坑记录 合理使用boundaryGap max 实际效果 项目问题记录 项目中有九宫格式九个柱状图显示 要求y轴显示三条分割线 两个分割间隔 使用同一个option 却展示
  • datawhale-web-task02

    0 背景 完成datawhale的web入门开发task02的学习 https github com datawhalechina whale web blob master task02 md task02内容如下 用户管理 通过上节课程
  • Linux安装JDK-8-附有百度网盘链接

    前提 全新安装 Linux 64位JDK8链接 提取码 x3s4 JDK官网下载地址 http www oracle com technetwork java javase downloads jdk8 downloads 2133151
  • 安装lamp详细版本

    font face font family 宋体 font face font family Verdana p MsoNormal li MsoNormal div MsoNormal margin 0cm 0cm 0 0001pt te
  • Java - 随机文件名生成 - 根据当前时间创建文件夹 - 文件上传后,放置到指定目录下(transferTo方式)

    目录 一 随机文件名生成 具体代码演示 二 根据当前时间创建文件夹 三 文件上传后 放置到指定目录下 参考链接 一 随机文件名生成 具体代码演示 UUID 模块是内置的 public static String getRandomName
  • [论文阅读] (02) SP2019-Neural Cleanse: Identifying and Mitigating Backdoor Attacks in Neural Networks

    神经清洁 神经网络中的后门攻击识别与缓解 Neural Cleanse Identifying and Mitigating Backdoor Attacks in Neural Networks Bolun Wang Yuanshun Y
  • Qt中使用C++中的std里的线程

    加入新的类 基类一定要选择QObject 使用C 中的thread save av cpp include save av h using namespace std 加入这个就可以使用C 里面的class thread 录制音视频 voi
  • iOS开发之ReactiveCocoa框架(RAC)第五篇队列与高级函数

    h文件 import ViewController h import ReactiveCocoa interface ViewController end implementation ViewController void viewDid
  • AE中绘制图形元素的方法

    AE中绘制图形元素的方法 Element元素对象是一个非常庞杂的对象集合 主要分为两大部分 图形元素 Graphic Element 和框架元素 Frame Element 图形元素包括GroupElement MarkerElement
  • 《大话vxworks》

    目录 序言 第一章 VxWorks简介 1 1 VxWorks的起源 1 2 发展历程 1 3 应用场景 第二章 VxWorks架构
  • 拦截器源码分析

    Slf4j Controller public class BlueController ResponseBody GetMapping bb public String bb HttpSession session return sess