Spring MVC拦截器(Interceptor)使用
第一篇Spring MVC的小作文就是关于Interceptor的,而不是很多基础的东西呢,很无奈。因为实践的项目中用到了,用地不太好,导致重复跳转页面浏览器cookie溢出了。
这个过程中呢就将与Interceptor在表现 层与@Controller之间的时序有关系大致捋了一遍——算是失败中的总结吧。
先上结论图:
错误案例:
需求:登录页面,验证用户是否有访问权限。拦截器验证该用户是否已登录,如已登录可继续访问,如未登录进入登录页面。基础代码参考https://www.cnblogs.com/ilovebath/p/14734097.html。
现在登录的基础上增加拦截器校验用户是否已登录功能(登录了session一直存在),具体实现如下:
一、请求拦截器实现,普通的Bean通过实现HandlerInterceptor接口可自定义拦截器
看下这个接口的定义,其声明了三个方法,分别对应上图中三次拦截点:
根据需求,我们使用的只有第一个方法preHandler,即在进入任何页面前判断登录状态。@Controler中控制了页面的跳转。具体拦截器实现如下
二、Web配置,通过实现WebMvcConfigurer的addInterceptors方法注册定义拦截器,实现如下:
三、运行
首先,在没有拦截器的情况下看实现效果:
由这个servlet控制进入login.jsp页面
输入用户名、密码后页面跳转失败:
为什么?看控制台输出
空指针问题,就是没有取到输入的用户名(为什么没有取到用户名,是另外一个问题,这里不讨论)。那么如果有拦截器,猜猜什么效果呢?应该是遇到此类情景重新跳转至登录页面。
那自定义的拦截器有没有实现呢?看添加拦截器后的效果
看控制台信息:
一直在提示请登录,为什么呢?这个就与开始提供的Interceptor与@Controller之间执行的时序有关系了。
分析:@Controller("tologin")这个控制进入login.jsp登录界面,但是在其执行前,interceptor先判断这个用户是否存在。也就是说还没有进入登录界面,就会一直提示需要进入登录界面重新跳转到tologin,但是tologin又需要等待interceptor放行让可执行,进而陷入死循环,好像有点死锁的意思。
那么怎么解决呢?排除login下的所有servlet,即仅非登录相关的servlet使用拦截器,如下:
验证与不使用拦截器效果一样:
四、解决获取session相关属性值的问题后(参考https://www.cnblogs.com/ilovebath/p/14737456.html),跟踪拦截器作用点:
增加一个@Controller作用类
注意login相关controller中关于重定向的编码:
下面是跟踪调试结果:
1、合法用户:
2、非法用户:
补充说明一下配置页面跳转快捷重定向的ViewController:
对于没有业务逻辑,只是简单页面跳转的@RequestMapping,可以考虑使用ViewController实现页面跳转简化配置,如下代码:
@RequestMapping("/index")
public String Hello(){
return "index";
}
在实现了WebMvcConfigurer的配置类中,添加
Spring MVC拦截器(Interceptor)使用的更多相关文章
- spring mvc拦截器interceptor
1. SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像123 ...
- Spring Boot 2.X(九):Spring MVC - 拦截器(Interceptor)
拦截器 1.简介 Spring MVC 中的拦截器(Interceptor)类似于 Servlet 开发中的过滤器 Filter,它主要用于拦截用户请求并作相应的处理,它也是 AOP 编程思想的体现, ...
- SSM(spring mvc+spring+mybatis)学习路径——2-2、spring MVC拦截器
目录 2-2 Spring MVC拦截器 第一章 概述 第二章 Spring mvc拦截器的实现 2-1 拦截器的工作原理 2-2 拦截器的实现 2-3 拦截器的方法介绍 2-4 多个拦截器应用 2- ...
- spring mvc 拦截器的使用
Spring MVC 拦截器的使用 拦截器简介 Spring MVC 中的拦截器(Interceptor)类似于 Servler 中的过滤器(Filter).用于对处理器进行预处理和后处理.常用于日志 ...
- 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor
[Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...
- 写的太细了!Spring MVC拦截器的应用,建议收藏再看!
Spring MVC拦截器 拦截器是Spring MVC中强大的控件,它可以在进入处理器之前做一些操作,或者在处理器完成后进行操作,甚至是在渲染视图后进行操作. 拦截器概述 对于任何优秀的MVC框架, ...
- Spring MVC拦截器浅析
Spring MVC拦截器 重点:Spring MVC的拦截器只会拦截控制器的请求,如果是jsp.js.image.html则会放行. 什么是拦截器 运行在服务器的程序,先于Servlet或JSP之前 ...
- Spring MVC拦截器配置
Spring MVC拦截器配置 (1)自定义拦截器 package learnspringboot.xiao.other; import org.springframework.web.servlet ...
- 对于Spring MVC 拦截器的一些了解
Spring MVC 拦截器的执行顺序 应用场景 假设请求 localhost:8080/ 则要求直接重定向到 localhost:8080/login ; 定义拦截器顺序 permission lo ...
随机推荐
- 战争游戏(War Games 1983)剧情
战争游戏 War Games(1983) 人工控制导弹发射 傍晚大雾,两值工作人员自驾一辆轿车到达监控俄罗斯核战争的防空基地,在门口出示工作证后进入基地,两工作人员和同事换班后,进入防空系统控制室开始 ...
- unittest测试框架
unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果. 一.u ...
- sql多行合并一列
with a as( select * from( select 1 userId , '天津' province union select 1 userId , '北京' union select ...
- 【解决了一个小问题】golang xorm中使用where id in (xxx),没办法使用参数替换
代码中使用XORM来从数据库查询数据,有类似如下的代码: session.Where("id in (?)", strings,Join(arr, ",")) ...
- .Net Core依赖注入
一.配置文件的读取 利用Startup类中的configuration读取appsettings.json中的配置 { "Logging": { "LogLevel&qu ...
- for in 遍历对象
如果直接写car.key会输出undefined,下面的注释是浏览器运行的原理,浏览器最终都是以car["key"]的方式来查找数据的
- 绑定方法和隐藏属性之property装饰器
目录 一:绑定方法 1.绑定给对象的方法 2.绑定给类的方法 3.非绑定方法之静态方法 二,隐藏属性 1.如何隐藏属性 三,property 装饰器 一:绑定方法 1.绑定给对象的方法 class P ...
- Java虚拟机的意义
什么是Java虚拟机? 作为程序员,大家都知道写的代码都是在Java虚拟机上运行的,但大家是否知道,Java虚拟机又是什么呢? 先看看网上搜到有关JAVA虚拟机的介绍 : 虚拟机是一种抽象化的计算机, ...
- eureka的简单介绍,eureka单节点版的实现?eureka的自我保护?eureka的AP性,和CP性?
注意!!! 这是对上一篇博客 springcloud的延续,整个项目的搭建,来源与上一篇博客.一.什么是eureka? // eureka是一个注册中心,实现了dubbo中zookeeper的效果! ...
- Linux之shell入门
一.编写规范 代码规范: #!/bin/bash [指定告知系统当前这个脚本要使用的shell解释器] shell相关指令 文件命名规范: 文件名.sh .sh是linux下bash shell 的默 ...