首页 > 其他分享 >Spring MVC 拦截器实现登录拦截以及多拦截器的配置执行详解

Spring MVC 拦截器实现登录拦截以及多拦截器的配置执行详解

时间:2022-12-20 22:01:16浏览次数:59  
标签:... 拦截器 preHandle 登录 Spring MVC 页面 afterCompletion

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情

前言

上一篇文章我们简单了解并完成了Spring MVC拦截器的入门案例,这一篇文章,我们将实际完成最常用的拦截功能——登录拦截,并且还会详细的讲解Spring MVC多拦截器的配置。

登录拦截

在我们的实际项目之中,大多数的项目都有登录注册的功能,有登录注册的功能。举个例子,比如我们现在有个电商平台的项目,如果需要查看购物车信息,我们就需要先登录,不可能说我们在浏览器中输入一个用户的购物车的url我们就能直接访问该用户的购物车,正常的情况是我们需要先登录才能进入购物车,所以我们就需要有登录拦截器。

拦截器常用参数

微信截图_20221023124313.png

我们Spring MVC中最常用的参数是requestresponsehandler

request:当前http请求。

response:当前http响应。

handler:为类型和/或实例计算选择要执行的处理程序。

这么解释handler参数可能不太理解SpringMVC会将请求通过处理器映射器将请求交给匹配的Handler处理,这个handler参数就是描述的处理请求的Handler。

编写前端页面

登录页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Login</title>
</head>
<body>
<form method="post" action="login">
    <input name="username" type="text" placeholder="用户名">
    <input name="password" type="password" placeholder="密码">
    <input type="submit" value="提交">
</form>
</body>
</html>
复制代码

这里我们设置表单提交的方式是POST,路径是login。

登录成功页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>success</h1>
</body>
</html>
复制代码

这里就简单的显示一个成功的文本。

创建userLoginController处理登录请求

微信截图_20221023163545.png 我们这里只是简单的演示登录,没有做校验,实际开发中是需要从数据库中获取用户信息,对比密码,密码正确才会登录成功。

我们登录成功之后将用户名存储到session中。

登录拦截器

微信截图_20221023164332.png

我们这里设置登录页面和跳转登录页面的路径放行。其他路径如果session中有用户名信息,则放行。没有用户名信息则跳转至登录页面。

配置拦截器

微信截图_20221023163740.png **是通配符,表示拦截所有路径。

测试登录拦截功能

直接访问http://localhost/user/toSuccess路径,我们发现不能进入登录成功的页面,会出现登录页面。

微信截图_20221023163903.png

我们登录之后才能进入登录成功的页面。

微信截图_20221023164115.png

这时候我们再次直接访问http://localhost/user/toSuccess路径,也可以进入登录成功的页面了。

微信截图_20221023164412.png

多拦截器配置以及执行问题

我们重新创建两个拦截器。

微信截图_20221023170431.png

微信截图_20221023170705.png

同样的,这两个拦截器也需要去配置。

微信截图_20221023170802.png

然后我们重启项目,去Postman中测试。

微信截图_20221023170919.png

请求成功后我们去查看打印信息:

preHandle 1...
preHandle 2...
查询商品列表
postHandle 2...
postHandle 1...
afterCompletion 2...
afterCompletion 1...
复制代码

发现了什么没有。

我们配置的拦截器的preHandle方法先执行了1然后执行2,剩下两个方法postHandleafterCompletion则相反,先执行的2后执行的1。

如果我们设置其中一个拦截器的preHandle方法返回false会怎么样呢?

设置拦截器1不放行。 微信截图_20221023171631.png

然后我们重启项目,去Postman中测试。

微信截图_20221023171732.png

这次没有请求成功。

我们来查看下打印的信息:

preHandle 1...
复制代码

设置拦截器2不放行。

微信截图_20221023172205.png

然后我们重启项目,去Postman中测试。

微信截图_20221023172153.png

这次同样没有请求成功。

我们来查看下打印的信息:

preHandle 1...
preHandle 2...
afterCompletion 1...
复制代码

这次打印信息与上次不同,拦截器2的preHandle方法和拦截器1的afterCompletion方法也执行了。

如果有三个拦截器又是什么情况呢?

设置拦截器2不放行。

打印结果:

preHandle 1...
preHandle 2...
afterCompletion 1...
复制代码

设置拦截器3不放行。

打印结果:

preHandle 1...
preHandle 2...
preHandle 3...
afterCompletion 2...
afterCompletion 1...
复制代码

至此我们可以得出一个规律:当有多个拦截器时,有一个拦截器不放行,其他拦截器都放行时,该拦截器的preHandle方法会执行,该拦截器前面的拦截器preHandle方法和afterCompletion都会执行,所有的postHandle方法都不执行。

总结

Spring MVC的拦截器实现登录拦截的功能以及多拦截器的配置执行详解我们就介绍到这里。喜欢的小伙伴们多多支持,你们的支持就是我更新的动力。

来源:https://juejin.cn/post/7157639112265039885

标签:...,拦截器,preHandle,登录,Spring,MVC,页面,afterCompletion
From: https://www.cnblogs.com/konglxblog/p/16995199.html

相关文章

  • mybatis拦截器 (拦截器不生产)
    背景:在一些需求下,使用拦截器会大大简化工作量也更加灵活:在项目中,要更新数据表的审计字段,比如create_time,creator,update_time,updator,这些字段,如果每一个表对应......
  • 设计模式,mvc,mvp,mvvm
    mvcmodel模型-视图view-控制器controller视图可以直接访问模型,所以视图里面包括模型信息,mvc关注的是模型不变,所以在mvc中,模型不依赖视图,但是view是依赖model的原理:模......
  • 构成 Spring Web 服务的各种组件(二)
    6.在客户端上使用SpringWeb服务Spring-WS提供了一个客户端Web服务API,允许对Web服务进行一致的XML驱动访问。它还迎合了编组程序和取消编组程序的使用,以便服务层代码可以......
  • SpringBoot - Yaml语法
    测试用到的类:类的属性必须重写Get与Set方法不管属性是私有的还是公共的,必须重写Get与Set方法@Component@ConfigurationProperties(prefix="student")publicclass......
  • Spring源码编译
    资料参考地址1:Spring源码编译准备环境配置JDK8(与Spring5的兼容性最好)spring:5.2.0release下载Spring源码直接去官方的github库下载,https://github.com/spring......
  • Spring batch
    1.springbatch--批处理框架2.结构:Job>Flow>Step>Chunk>readprocesswrite2.1基本概念:SpringBatch运行基本单位是一个job,一个job就做一件批处理事情。......
  • SpringBoot - @ImportResource,@ConfigurationProperties 让xml生效与类属性绑定配置文
    @ImportResource作用:使用.xml配置文件范围:必须使用在主程序@SpringBootApplication或配置类上@Configuration@SpringBootApplication@ImportResource("classpath:appl......
  • SpringBoot - 条件注解 @Conditional
    @ConditiOnBean作用:如果Spring容器里面存在指定的Bean则生效范围:类上,方法上,一般在配置类中使用参数:value参数类型Class[],name参数类型String[]IOC容器中组件的名称......
  • mvc中,js 如何直接使用后端参数
    问题比如后端传了一个boolean类型的参数,js如果直接使用这个参数,比如这么写就是错的if(${redevice}){document.getElementById('redevice').checked=true;}......
  • (1)SpringMVC前传
    在我们熟知的建立在三层结构(表示层、业务逻辑层、持久层)基础之上的J2EE应用程序开发之中,表示层的解决方案最多。因为在表示层自身的知识触角很多,需要解决的问题也不少,这也就......