第一篇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)使用的更多相关文章

  1. spring mvc拦截器interceptor

    1.  SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像123 ...

  2. Spring Boot 2.X(九):Spring MVC - 拦截器(Interceptor)

    拦截器 1.简介 Spring MVC 中的拦截器(Interceptor)类似于 Servlet 开发中的过滤器 Filter,它主要用于拦截用户请求并作相应的处理,它也是 AOP 编程思想的体现, ...

  3. SSM(spring mvc+spring+mybatis)学习路径——2-2、spring MVC拦截器

    目录 2-2 Spring MVC拦截器 第一章 概述 第二章 Spring mvc拦截器的实现 2-1 拦截器的工作原理 2-2 拦截器的实现 2-3 拦截器的方法介绍 2-4 多个拦截器应用 2- ...

  4. spring mvc 拦截器的使用

    Spring MVC 拦截器的使用 拦截器简介 Spring MVC 中的拦截器(Interceptor)类似于 Servler 中的过滤器(Filter).用于对处理器进行预处理和后处理.常用于日志 ...

  5. 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor

    [Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...

  6. 写的太细了!Spring MVC拦截器的应用,建议收藏再看!

    Spring MVC拦截器 拦截器是Spring MVC中强大的控件,它可以在进入处理器之前做一些操作,或者在处理器完成后进行操作,甚至是在渲染视图后进行操作. 拦截器概述 对于任何优秀的MVC框架, ...

  7. Spring MVC拦截器浅析

    Spring MVC拦截器 重点:Spring MVC的拦截器只会拦截控制器的请求,如果是jsp.js.image.html则会放行. 什么是拦截器 运行在服务器的程序,先于Servlet或JSP之前 ...

  8. Spring MVC拦截器配置

    Spring MVC拦截器配置 (1)自定义拦截器 package learnspringboot.xiao.other; import org.springframework.web.servlet ...

  9. 对于Spring MVC 拦截器的一些了解

    Spring MVC 拦截器的执行顺序 应用场景 假设请求 localhost:8080/ 则要求直接重定向到 localhost:8080/login ; 定义拦截器顺序 permission lo ...

随机推荐

  1. Eureka原理与架构

    一.原理图 Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址 提供者:启动后向Eureka注册自己信息(地址,提供什么服务) 消费者:向Eureka订阅服务,Eureka会将对应服 ...

  2. Enumy:一款功能强大的Linux后渗透提权枚举工具

    Enumy是一款功能强大的Linux后渗透提权枚举工具,该工具是一个速度非常快的可移植可执行文件,广大研究人员可以在针对Linux设备的渗透测试以及CTF的后渗透阶段利用该工具实现权限提升,而Enum ...

  3. Python 为什么不设计 do-while 循环结构?

    在某些编程语言中,例如 C/C++.C#.PHP.Java.JavaScript 等等,do-while 是一种基本的循环结构. 它的核心语义是:先执行一遍循环体代码,然后执行一遍条件语句,若条件语句 ...

  4. C#获取http图片

    public Image GetHttpImage(string url) { var client = new HttpClient(); var uri = new Uri(Uri.EscapeU ...

  5. 用Cesium可视化地下设施、矿山和地质层

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 本月的CesiumJS 1.70发布引入的一项关键改进是地下数据 ...

  6. golang中结构体标签在json中的应用

    package main import ( "encoding/json" "fmt" "reflect" ) type Movie str ...

  7. spring内嵌cglib包,这里藏着一个大坑

    问题发现 2022-01-21 早上 9 点,订单系统出现大面积的"系统未知错误"报错,导致部分用户无法正常下单.查询后台日志,可以看到大量的 duplicate class at ...

  8. 使用ansible 批量分发ssh密钥

    先看执行结果 看看ssh.yml怎么写的 看看hosts文件中backup组怎么写的

  9. Error: xz compression not available解决办法

    centos6升级php时误安装: rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm rpm -Uvh https://mir ...

  10. 学习JAVAWEB第九天

    ## XML: 1. 概念:Extensible Markup Language 可扩展标记语言 * 可扩展:标签都是自定义的. <user> <student> * 功能 * ...