news 2026/8/7 12:06:54

第十一章篇 实现拦截器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第十一章篇 实现拦截器

SpringMVC中拦截器用于对处理器(controller)进行预处理和后处理。

拦截器需要实现Interceptor接口,接口有是哪个方法,分别为:

preHandle: 客户端发送请求,在处理器执行请求之前执行preHandle方法中逻辑,当该方法返回true则执行下个拦截器(如果有),或者处理器

postHandle: 当处理器执行完之后,视图渲染之后执行该方法 。 后置处理,对ModelAndView进行修改

afterCompletion: 在整个请求结束(视图渲染之后)执行。对资源进行关闭,记录日志

代码实现
创建拦截器类实现HandlerInterceptor接口
/** * 自定义拦截器类 */ @Component public class MyInterceptor implements HandlerInterceptor { /** * 在视图渲染之后执行的方法 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("---------afterCompletion--------"); } /** * 表示 请求 执行处理器方法之前,先执行拦截器中prehandle方法中的逻辑 * @param request 请求对象 * @param response 响应对象 * @return boolean 如果指定该方法逻辑之后返回true,则执行下一个拦截器(如果有),如果没有就执行处理器 。返回false表示拦截当前请求 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("--------preHandle------------"); return false; //放行 } /** * 在执行处理器之后,渲染视图之前执行 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("---------postHandle--------"); } }
创建配置类,设置拦截器拦截处理器
/** * 自定义配置类 * 配置拦截器 */ @Configuration public class MyConfiguration implements WebMvcConfigurer { @Autowired private MyInterceptor myInterceptor; /** * 重写添加拦截器方法 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { //添加拦截器 registry.addInterceptor(myInterceptor) //设置拦截器目标(处理器) // .addPathPatterns("/user/login","/params") //拦截部分url信息 .addPathPatterns("/**") //拦截所有处理器(Controller),注意包括静态资源 .excludePathPatterns("/userDetail.html"); //表示用户访问login页面时不会被拦截器 } }
登录方法
@RestController public class LoginController { /** * 用户登录方法 */ @RequestMapping("login") public ResultObj login(String username,String password){ //判断用户名和密码是否正确 if(username.equals("root") && password.equals("234")){ return ResultObj.ok(username); }else { //表示用户名或密码错误, 抛出异常对象 throw new UserNameAndPWDErrorException("用户名或密码错误"); } } }

练习

通过拦截器实现用户认证操作

有登录页面、和登录接口 可以在用户不用登录即可访问

定义用户管理CRUD操作,这些操作需要用户认证之后方可访问

定义拦截器实现访问拦截器,判断用户是否登录,如果登录则可以访问 用户管理中CRUD接口,否则不能访问

思路:使用拦截器将所有资源拦截,放行登录页面和登录的接口,登录成功后设置一个session保存一个身份令牌用于让拦截器进行放行,在拦截器中进行编写代码:凡是没有session身份令牌的访问一律拦截

代码实现

创建登录页面

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录页面</title> </head> <body> <!-- 用户登录表单--> <form action="/user/login" method="post"> <div> <input type="text" name="uname" placeholder="请输入用户名称" /> </div> <div> <input type="password" name="pwd" placeholder="请输入用户密码" /> </div> <div> <input type="submit" value="登录账号" /> <input type="reset" /> </div> </form> </body> </html>

UserController类

@RestController public class UserController { /** * 用户登录 接口方法 */ @RequestMapping("/user/login") public ResultObj login(@RequestParam String uname, @RequestParam String pwd, HttpSession session){ //1.判断用户名和密码是否正确 if(uname.equals("ykj") && pwd.equals("333")){ //表示用户登录成功 //保存用户信息到session对象 session.setAttribute("uname", uname); //响应成功信息给前端 return ResultObj.ok(uname); }else { //表示登录失败 throw new UserNameAndPWDErrorException("你输入用户名和密码错误"); } } /** * 查询所有用户信息 */ @RequestMapping("/selectAll") public ResultObj selectAll(){ return ResultObj.ok().msg("查询所有用户成功!"); } /** * 新增方法 */ @RequestMapping("/addUser") public ResultObj addUser(){ return ResultObj.ok().msg("新增用户成功"); } /** * 删除方法 */ @RequestMapping("/delById") public ResultObj delById(Integer uid){ return ResultObj.ok().msg("删除用户成功"); } }

创建用户认证拦截器

/** * 自定义用户认证 拦截器 */ @Component public class CheckIsLoginHandlerIntercptor implements HandlerInterceptor { ​ /** * 用户在方法指定方法之前执行执行逻辑代码 * 判断用户是否登录 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //1.获取sesssion对象 HttpSession session = request.getSession(); //2.获取用户名 String uname = (String) session.getAttribute("uname"); //3.判断uname是否有值 if(uname != null && !uname.trim().isEmpty()){ //表示用户一登录 return true;//放行 } //重定向到登录页面 response.sendRedirect("/loginPage.html"); return false;//拦截器 } }
修改配置类,并配置拦截器
/** * 自定义配置类 * 配置拦截器 */ @Configuration public class MyConfiguration implements WebMvcConfigurer { ​ @Autowired private MyInterceptor myInterceptor; @Autowired private CheckIsLoginHandlerIntercptor checkIsLoginHandlerIntercptor; /** * 重写添加拦截器方法 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { //添加拦截器 registry.addInterceptor(checkIsLoginHandlerIntercptor) //设置拦截器目标(处理器) // .addPathPatterns("/user/login","/params") //拦截部分url信息 .addPathPatterns("/**") //拦截所有处理器(Controller),注意包括静态资源 .excludePathPatterns("/loginPage.html","/user/login"); //表示用户访问login页面时不会被拦截器 } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/7 12:09:28

ASTM D4169-DC13 标准,包装完整性

标准全称&#xff1a;Standard Practice for Performance Testing of Shipping Containers and Systems (运输集装箱和系统性能测试的标准实施规程)发布机构&#xff1a;美国材料与试验协会 (ASTM International)最新版本&#xff1a;ASTM D4169-2023e1&#xff08;2024 年 3 月…

作者头像 李华
网站建设 2026/8/6 17:56:28

Linux新手必学:tail命令图解指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 制作一个交互式新手教程&#xff0c;包含&#xff1a;1. tail命令基础介绍动画 2. 实时命令行模拟器 3. 渐进式练习(从查看文件末尾到实时监控) 4. 常见错误提示。使用HTMLJS实现&a…

作者头像 李华
网站建设 2026/8/7 0:01:42

19、利用Scapy和Python进行网络数据包处理与扫描

利用Scapy和Python进行网络数据包处理与扫描 1. Scapy数据包捕获与重放 Scapy具备监听网络接口并捕获所有传入数据包的能力,它可以像tcpdump一样将数据包写入pcap文件。此外,Scapy还提供了读取和重放pcap文件的额外功能。 1.1 简单数据包重放 以下是一个简单的数据包重放…

作者头像 李华
网站建设 2026/8/7 18:46:23

性能测试里MySQL的锁

这篇文章我想来聊聊 MySQL 的锁是怎么加上的&#xff0c;为啥想聊这个呢&#xff1f;主要是因为业务中我们或多或少都会使用到锁&#xff0c;毕竟锁是保障我们数据安全性的关键法宝。但是由于不了解原理&#xff0c;往往可能导致我们在”刻意“或者”无意“的使用场景下&#x…

作者头像 李华
网站建设 2026/8/7 22:12:11

OBS教程:OBS实时字幕插件如何下载?直播字幕翻译怎么弄?

OBS教程&#xff1a;OBS实时字幕插件如何下载&#xff1f;直播字幕翻译怎么弄&#xff1f;直播实时翻译软件哪个好&#xff1f;OBS实时字幕插件官方下载地址 首先介绍一下OBS实时字幕插件支持哪些功能&#xff1a; 1、将主播所说的话显示为文字&#xff0c;逐字逐句实时显示字…

作者头像 李华
网站建设 2026/8/7 8:08:20

MagicTime: Time-Lapse Video Generation Models asMetamorphic Simulators论文精读(1)

T2V的最新进展在文本描述合成高质量的一般视频方面取得了显著成功&#xff0c;但是在T2V中有一个被忽视的问题&#xff1a;没有充分编码真实世界的物理知识&#xff0c;因此生成的视频往往运动会被限制&#xff0c;变化不佳。因此本文提出了一个变形延时视频生成模型&#xff0…

作者头像 李华