Spring MVC 拦截器实现登录拦截以及多拦截器的配置执行详解
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情
前言
上一篇文章我们简单了解并完成了Spring MVC拦截器的入门案例,这一篇文章,我们将实际完成最常用的拦截功能——登录拦截,并且还会详细的讲解Spring MVC多拦截器的配置。
登录拦截
在我们的实际项目之中,大多数的项目都有登录注册的功能,有登录注册的功能。举个例子,比如我们现在有个电商平台的项目,如果需要查看购物车信息,我们就需要先登录,不可能说我们在浏览器中输入一个用户的购物车的url我们就能直接访问该用户的购物车,正常的情况是我们需要先登录才能进入购物车,所以我们就需要有登录拦截器。
拦截器常用参数
我们Spring MVC中最常用的参数是request
、response
、handler
。
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处理登录请求
我们这里只是简单的演示登录,没有做校验,实际开发中是需要从数据库中获取用户信息,对比密码,密码正确才会登录成功。
我们登录成功之后将用户名存储到session中。
登录拦截器
我们这里设置登录页面和跳转登录页面的路径放行。其他路径如果session中有用户名信息,则放行。没有用户名信息则跳转至登录页面。
配置拦截器
**
是通配符,表示拦截所有路径。
测试登录拦截功能
直接访问http://localhost/user/toSuccess
路径,我们发现不能进入登录成功的页面,会出现登录页面。
我们登录之后才能进入登录成功的页面。
这时候我们再次直接访问http://localhost/user/toSuccess
路径,也可以进入登录成功的页面了。
多拦截器配置以及执行问题
我们重新创建两个拦截器。
同样的,这两个拦截器也需要去配置。
然后我们重启项目,去Postman中测试。
请求成功后我们去查看打印信息:
preHandle 1...
preHandle 2...
查询商品列表
postHandle 2...
postHandle 1...
afterCompletion 2...
afterCompletion 1...
复制代码
发现了什么没有。
我们配置的拦截器的preHandle
方法先执行了1然后执行2,剩下两个方法postHandle
和afterCompletion
则相反,先执行的2后执行的1。
如果我们设置其中一个拦截器的preHandle
方法返回false会怎么样呢?
设置拦截器1不放行。
然后我们重启项目,去Postman中测试。
这次没有请求成功。
我们来查看下打印的信息:
preHandle 1...
复制代码
设置拦截器2不放行。
然后我们重启项目,去Postman中测试。
这次同样没有请求成功。
我们来查看下打印的信息:
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的拦截器实现登录拦截的功能以及多拦截器的配置执行详解我们就介绍到这里。喜欢的小伙伴们多多支持,你们的支持就是我更新的动力。