Spring MVC 拦截器

如何实现session共享问题:

1、session都在内存里面存储的,只要有session对象我都分发出去,让其他应用都可以拿到(同步)

缺点:只要有session对象都要广播出去,而且用户应用比较多了就会导致服务压力大,

2、使用token,登录完之后给你一个token,然后加密完之后发给服务器,用的时候直接把token给带过来即可,别的应用调用的时候就会拿到token相应的信息,这样就解决了session共享问题。

Spring MVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。

1.1 拦截器的定义

在 Spring MVC 框架中定义一个拦截器需要对拦截器进行定义和配置,

定义一个拦截器可以通过两种方式:

  • 一种是通过实现 HandlerInterceptor 接口实现类来定义;
  • 一种是通过实现 WebRequestInterceptor 接口继承 WebRequestInterceptor 接口的实现类来定义

代码编辑在interceptor包下创建

public class TokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle方法处理控制器(controller)方法调用之前");String token=request.getParameter("token");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("preHandle方法处理控制器(controller)方法调用之后,在解析视图之前执行");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion在视图渲染之后执行");}
}

配置类里面配置拦截器

@EnableWebMvc
@Configuration
public class WebConfig  implements  WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/**");}

对token进行验证判断:

 @Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle方法处理控制器(controller)方法调用之前");String token=request.getParameter("token");//对token进行判断if(token !=null && token.equals("206")){return true;}System.out.println("不是206学员");return false;}

访问测试:http://localhost:8080/gff/mother?token=206

如果被拦截了,是不是要给一个响应信息,或错误信息。

另外jwt里面也介绍说明:需要放到请求头里面

JWT跨域认证解决方案_赵同学&的博客-CSDN博客

运行测试:

除了返回状态码还可以指定放回格式:

@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle方法处理控制器(controller)方法调用之前");//获取请求头 getheaderString token=request.getHeader("token");if(token !=null && token.equals("206")){return true;}System.out.println("不是正牌男友");//错误状态码// onse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);//指定返回格式response.setContentType("application/json;charset=utf-8");response.getWriter().write("{\"code\":401,\"message\":\"token必须传入\"}");return false;}

如果第一个拦截器出现问题了怎么办? 可以在添加一个:新创建一个SexInterceptor

public class SexInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle方法处理控制器(controller)方法调用之前");String token=request.getParameter("sex");if(token !=null && token.equals("girl")){return true;}System.out.println("什么玩意");response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}

配置类配置:多拦截配置

@Overridepublic void addInterceptors(InterceptorRegistry registry) {//order值越小越先执行registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/**");registry.addInterceptor(new SexInterceptor()).addPathPatterns("/**");}

使用order调整顺序: order值越小越先执行

@Overridepublic void addInterceptors(InterceptorRegistry registry) {//order值越小越先执行registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/**").order(2);registry.addInterceptor(new SexInterceptor()).addPathPatterns("/**").order(1);}

放行验证:创建一个controller:

@RestController
@RequestMapping("/glf")
public class GirlFriendController {
​@GetMapping("/old")public String select(){
​return "这是你们前女友";}

比如针对性拦截:api路径 

@Overridepublic void addInterceptors(InterceptorRegistry registry) {//order值越小越先执行registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/api/**").order(2);
​}
public class TokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle方法在HandlerMethod执行之前");//获取tokenString token = request.getHeader("token");//如果token不为空,进行token验证if (token.equals("123456")) {return true;}//没有token,直接返回401//  response.setStatus(401);//或者response.setContentType("application/json;charset=utf-8");response.getWriter().write("{\"code\":401,\"message\":\"token必需传\"}");return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle方法在HandlerMethod调用之后,解析视图之前执行");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion方法在视图渲染结束之后执行");}
}

  在上述拦截器的定义中实现了 HandlerInterceptor 接口,并实现了接口中的 3 个方法。有关这 3 个方法的描述如下。

  • preHandle 方法:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。

  • postHandle 方法:该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。

  • afterCompletion 方法:该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。

1.2 配置代码

@Configuration
//开启 Spring MVC注解驱动
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 可添加多个// order 谁小谁先拦截registry.addInterceptor(new TokenIntercepter()).addPathPatterns("/**").order(2);registry.addInterceptor(new SexIntercepter()).addPathPatterns("/**").order(1);}/*** 视图配置*/@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {WebMvcConfigurer.super.configureViewResolvers(registry);registry.viewResolver(resourceViewResolver());/*registry.jsp("/WEB-INF/jsp/",".jsp");*/}/*** 配置请求视图映射*/private InternalResourceViewResolver resourceViewResolver(){InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();//请求视图文件的前缀地址internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");//请求视图文件的后缀internalResourceViewResolver.setSuffix(".jsp");return internalResourceViewResolver;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编程导航算法通关村第 1关 | 单链表的操作

编程导航算法通关村第 1关 | 链表的操作 文章目录 编程导航算法通关村第 1关 | 链表的操作单链表链表的定义初始化链表的遍历获取链表的长度链表的插入链表的节点的删除 双向链表节点的定义双向链表的定义节点的打印获取长度头部插入元素尾部插入元素链表的删除 单链表 链表的…

jenkins发布使用邮件添加审批

首先安装好Email Extension Plugin插件并在 system下配置好邮件 然后配置流水线需要的参数 ![在这里插入图片描述](https://img-blog.csdnimg.cn/418fc89bfa89429783a1eb37d3e4ee26.png#pic_center pipeline如下: def skipRemainingStages false //是否跳过生…

采集发布到WordPress网址(OneNav主题-WordPress主题)

WordPress系统的一导航主题(OneNav主题)是集网址、资源、资讯于一体的导航主题。 要将采集的数据批量自动发布到一导航主题(OneNav主题)的网址要怎么设置? 普通的文章采集器一般只能发布为wordpress文章类型&#xff…

自监督语义分割面模型——Masked Autoencoders Are Scalable Vision Learners(MAE)论文阅读

1、摘要 This paper shows that masked autoencoders (MAE) are scalable self-supervised learners for computer vision. Our MAE approach is simple: we mask random patches of the input image and reconstruct the missing pixels. It is based on two core designs. F…

Go语言之函数,返回值,作用域,传参,匿名函数,高阶函数,闭包函数

函数声明和调用 go语言是通过func关键字声明一个函数的,声明语法格式如下 func 函数名(形式参数) (返回值) {函数体return 返回值 // 函数终止语句 }函数名:由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名…

SpringBoot使用JWT进行身份验证

JWT身份验证的流程 用户登录: 用户向服务器提供他们的用户名和密码。 服务器验证:服务器接收到请求,验证用户名和密码。 生成JWT:如果用户名和密码验证通过,服务器将创建一个 JWT。 JWT 包含了一些数据(称…

【activiti】工作流入门基础概念

Activiti 为什么使用activitiactiviti流程步骤表结构分四种:四个重要的服务类BusinessKey挂起流程变量:注意:网关:精细控制流程走向组任务分配:抄送:activiti工作流获取流程定义中所有的节点: 为什么使用ac…

[JVM] 5. 运行时数据区(2)-- 程序计数器(Program Counter Register)

一、概述 JVM中的程序计数器(Program Counter Register)是对物理PC寄存器的一种抽象模拟。它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。在 JVM 规范中,每个线程都有它自己的程序计数器,是…

redis之主从复制、哨兵、集群

文章目录 一、redis的高可用1.1 redis高可用的概念1.2 Redis的高可用技术 二、redis 主从复制2.1主从复制的原理2.2搭建Redis 主从复制 三、Redis 哨兵模式3.1搭建Redis 哨兵模式3.2启动哨兵模式3.3查看哨兵信息3.4故障模拟 四、Redis 群集模式4.1搭建Redis 群集模式 一、redis…

【Excel】excel多个单元格的内容合并到一个单元格,并使用分隔符

方法一:使用连接符 & 左键单击选中“D2”单元格,在D2单元格中输入公式“A2&B2&C2”,按“Enter”即可实现数据合并。 ------如果想连接的时候,中间加分隔符,可以使用:公式A2&"&#xf…

常用的rsync使用方式

发送文件夹并保持文件属性不变 rsync -avr path xxx192.168.x.x:~/path 关于rsync的说明: rsync is a file transfer program capable of efficient remote update via a fast differencing algorithm. Usage: rsync [OPTION]... SRC [SRC]... DEST or rsyn…

STL unordered_set的eraseyong fa

如下unordered_set的erase操作导致程序崩溃&#xff0c;crash。 #include <iostream> #include <string> #include <unordered_set> int main () { std::unordered_set<std::string> myset {"USA","Canada","France&qu…

Azure Kinect 之 Note(一)

Azure Kinect Azure Kinect DK 是一款开发人员工具包&#xff0c;配有先进的AI 传感器&#xff0c;提供复杂的计算机视觉和语音模型。 Kinect 将深度传感器、空间麦克风阵列与视频摄像头和方向传感器整合成一体式的小型设备&#xff0c;提供多种模式、选项和软件开发工具包(S…

面试题更新之-HTML5的新特性

文章目录 导文新特性有哪些&#xff1f;HTML5的新特性带来了许多好处 导文 面试题更新之-HTML5的新特性 新特性有哪些&#xff1f; HTML5引入了许多新特性和改进&#xff0c;以下是一些HTML5的新特性&#xff1a; 语义化标签&#xff1a;HTML5引入了一系列的语义化标签&#…

远程在Ubuntu20.04安装nvidia显卡驱动

第零步&#xff0c;找人装一个todesk。 在终端运行&#xff1a; ifconfig 记住ip地址&#xff0c;后面要用。 第一步&#xff0c;安装软件&#xff1a; sudo apt-get update sudo apt-get install g gcc make 第二步&#xff0c;下载显卡驱动&#xff1a; 官方驱动 | NVI…

【ThinkPHP】实现一个逆向工程生成model

ThinkPHP为了节省一些重复的步骤&#xff0c;写了个简单版的生成model的工具&#xff0c;逆向生成model代码&#xff0c;节省时间&#xff0c;专注写业务代码。 ThinkPHP中的命令行也提供了一些生成代码的命令&#xff1a; make:controller 创建控制器 make:model 创建模型 m…

医院制剂研发与真实世界评价论坛圆满闭幕

医院制剂是新药的摇篮和宝库&#xff0c;现代科技为医院制剂的研发和转化赋能。在新时代新政策下&#xff0c;2023年07月16日&#xff0c;由湖南省药学会医院制剂研发与真实世界评价专业委员会&#xff08;下称“专委会”&#xff09;主委单位湖南易能生物医药有限公司&#xf…

划片机的技术分解

划片机是一种切割设备&#xff0c;主要用于将硬脆材料&#xff08;如硅晶圆、蓝宝石基片、LED基片等&#xff09;分割成较小的单元。其工作原理是以强力磨削为划切机理&#xff0c;通过空气静压电主轴带动刀片与工件接触点的划切线方向呈直线运动&#xff0c;将每一个具有独立电…

MVVM模式的具体实现

MVVM即Model-View-ViewModel的简写。即模型-视图-视图模型。 模型&#xff08;Model&#xff09;指的是后端传递的数据。 视图(View)指的是所看到的页面。 视图模型(ViewModel)是mvvm模式的核心&#xff0c;它是连接view和model的桥梁。 它有两个方向&#xff1a; 一是将视图(V…

概率论的学习和整理18:为什么 P(至少成功1次) = Σ P(几何分布) ,总结几何分布和连续失败概率的关系,二项分布和累计成功k次的关系

目录 1 先说结论&#xff1a; 2 Σ几何分布的P(xn) P(n次试验至少成功1次) 2.1 几何分布的概率 2.2 这个是可以证明的&#xff0c;下面是推导过程 2.3 怎么理解呢&#xff1f; 3 另外&#xff0c;P(累计成功k次) ΣP(成功k次的二项分布) 3.1 成功k次的概率 和 累计成…