第一篇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. Object.keys()方法 返回对象属性数组

    MDN语法 Object.keys(obj) 参数obj:要返回其枚举自身属性的对象. 返回值:一个表示给定对象的所有可枚举属性的字符串数组. 1.传入一个对象,返回的的是所有属性值 var obj2 ...

  2. golang取地址操作采坑:for idx,item := range arr中的item是个独立对象

    先看代码: package main import "fmt" func main() { type s struct { A string B int32 } arr := [] ...

  3. 【记录一个问题】用ndk的gcc命令行无法编译C++11的lambda等语法的代码

    /Users/ahfu/code/android/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_6 ...

  4. unity3d之public变量引发错误

    public变量引发错误 在vs ide中怎么更改也无效 后来发现public里面的值一直不改变,手动改之.

  5. IoC容器-Bean管理XML方式(创建对象和set注入属性,有参构造注入属性)

    Ioc操作Bean管理 1,什么是Bean管理 (0)Bean管理指的是两个操作 (1)Spring创建对象 (2)Spring注入属性 2,Bean管理操作有两种方式 (1)基于xml配置文件方式实 ...

  6. Centos配置yum本地源最简单的办法

    有关centos配置yum本地源的方法 一.前提 先连接镜像 然后在命令行输入如下命令 mount /dev/sr0 /mnt cd /etc/yum.repos.d/ ls 之后会看到如下的界面 二 ...

  7. @ResponeBody 和 @RequestBody

    一.补充注解?1.@ResponseBody 将数据转成json 并输出到响应流中2.@RequestBody 将请求中的json数据转换成java对象.1.1 jsp页面 增添两个点击事件. 1.2 ...

  8. SharePoint Online 触发 Outlook 邮件内审批

    前言 我们在做SharePoint Online项目时, 经常会有客户问,我们能否在通知邮件中快速完成审批,而不是需要在邮件中打开系统,然后在系统中审批? 答案肯定是可以的,来!安排! 正文 1.我们 ...

  9. opencvsharp 根据row方向和面积筛选连通域的两种方式

    ConnectedComponents cc = Cv2.ConnectedComponentsEx(tempMat);//相当于halcon的connection获取全部连通域 int blobnu ...

  10. super、this、抽象类、继承

    super 代表是父类对象,并且在创建子类对象时,就先创建父类对象,再创建子类对象,可以在子类方法中使用super调用父类的非私有方法. this 代表本类对象,谁创建就代表谁 实体类,被创建的cla ...