当前位置: 首页 > news >正文

第十一章篇 实现拦截器

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页面时不会被拦截器 } }
http://www.jsqmd.com/news/73366/

相关文章:

  • 揭秘MCP PL-600多模态Agent设计:如何实现跨模态协同与自主决策
  • 从零构建智能Agent编排系统,掌握Docker Swarm与K8s协同秘技
  • Docker Buildx构建缓慢?你必须知道的7个Agent镜像优化实践
  • Linux新手必学:tail命令图解指南
  • 8 个自考论文降重工具,AI 免费网站推荐
  • 如何为你的Python项目构建pyproject.toml文件
  • 新手鱼竿推荐:新手买钓鱼竿怎么选?2025年鱼竿新手入门推荐 - 品牌2026
  • C++ ⼀级 2023 年06 ⽉
  • NPI(New Product Introduction)工程师职责介绍
  • 卡内基跨学科团队利用随机森林模型,基于406份样本成功捕捉33亿年前生命遗迹
  • 【STM32】低功耗
  • 基于 ESP32 的对话机器人实现:整合 Coze 大模型、百度千帆 ASR 与 TTS
  • Spark 运行架构及相关概念
  • 基于SpringBoot的学生评奖评优管理系统-计算机毕业设计源码+LW文档分享
  • MySQL 主从同步与读写分离详解
  • 2025年鱼竿排列前十的品牌:山东威海鱼竿生产厂家精选解析 - 品牌2026
  • 护网行动关键方向深度分享:应急响应 / 云原生防护等五大领域文章 + 实战技巧,附案例拆解!
  • 基于SpringBoot的学生学习成果展示平台的实现-计算机毕业设计源码+LW文档分享
  • 【稀缺资源】全球仅5%团队掌握的供应链量子优化代码模板(Python版)
  • 98465
  • http协议中各个网段含义
  • MagicTime: Time-Lapse Video Generation Models asMetamorphic Simulators论文精读(1)
  • 你用过哪些国产实时数据库?
  • ISO20000新版标准深度解析:5大关键变化如何重塑IT服务管理
  • OpenHarmony Flutter 分布式安全与隐私保护:跨设备可信交互与数据防泄漏方案
  • 计算机Java毕设实战-基于springboot高校大学生心理咨询管理系统springboot大学生心理健康分析及干预平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • C++设计模式大乱斗:让代码不再“乱炖”(一)
  • MediaPipe Hands实战指南:从算法原理到工程部署的深度解密
  • Python列表类型详解
  • 运维系列Windows系列【仅供参考】:Win11暂停更新点不了怎么办?Win11暂停更新是灰色的如何解决?